IOS学习笔记 O2
- 第二章 Objective-C语言基础进阶
一、Objective-C语言写法简化
- 利用@property快速生成setget方法
1、首先来复习一下setget写法,这是上一节笔记写的setget方法的User.h文件
#import <Foundation/Foundation.h> @interface User : NSObject
{
NSString * _name; //定义字符串变量
NSString * _sex;
NSInteger _age; //定义整型变量
}
/*********setget方法*********/
/**定义set用户昵称的方法*/
- (void) setName:(NSString *) name;
/**定义get用户昵称的方法*/
- (NSString *)name;
/**定义set性别的方法*/
- (void) setSex:(NSString *) sex;
/**定义get性别的方法*/
- (NSString *)sex;
/**定义set年龄的方法*/
- (void) setAge:(NSInteger) age;
/**定义get年龄的方法*/
- (NSInteger)age; /*********其他方法*********/
/**定义声明类的方法*/
- (void) createMyClass;
@end //虽然这种写法简单易懂,条理分明,但是看起来模式化的语言结构是不是有些繁琐呢?笔者在刚接触OC的时候,也被setget方法烦到不行。但是万能的程序猿同学还是给出了一种方便又简捷的办法来书写setget方法。
2、利用@property来简写setget方法
User.h文件:
#import <Foundation/Foundation.h> @interface User : NSObject
@property NSString * name; //定义字符串变量
@property NSString * sex;
@property NSInteger age; //定义整型变量
/*********其他方法*********/
/**定义声明类的方法*/
- (void) createMyClass; @end //没错,这样我们就完成了Users这个类接口部分的编写!!
User.m文件:
#import <Foundation/Foundation.h>
#import "User.h" @implementation User
/**声明类的方法*/
- (void) createMyClass{
NSLog(@"声明一个名为User的类");
} @end
//至此我们就完成了Users这个类实现部分的编写!!
12 //初学的同学一定是已经惊呆了,为什么可以这么简单。。。。。。笔者写到这回想昨天那段代码,对象三个属性就写的笔者泪流满面了。。。。。。。
>>使用@property请注意一下几个事项:
>>>1、使用@property时,父类名后边的花括号省略。
>>>2、使用@property时,会严格按照setget的写法自动生成setget方法对应的接口部分和实现部分,这就是为什么setget在书写的时候会有严格的要求。
>>>3、如果想要对setget生成的方法进行改写,只需要按照原来的要求与格式,在setget的实现部分进行更改就可以了。
- 利用点语法给对象属性赋值
1、首先来复习一下上一篇中如何set方法给对象的属性赋值
#import <Foundation/Foundation.h>
#import "User.h" //定义main方法,作为程序入口
int main(int argc,char *argv[])
{
@autoreleasepool //自动释放池
{
User * user1=[[User alloc]init]; //声明对象并开辟对象的内存空间
[user1 setName:@"Jereh"]; //调用set方法给字符串型变量name赋值
[user1 setSex:@"Male"]; //调用set方法给字符串型变量sex赋值
[user1 setAge:]; //调用set方法给整型变量sex赋值
[user1 createMyClass]; //调用createMyClass方法,打印“声明一个名为User的类”
NSLog(@"\n姓名:%@\n性别:%@\n年龄:%ld\n",[user1 name],[user1 sex],[user1 age]); //打印用户信息,User1后边的name,sex,age均使用了get方法来获取对象的属性
}
return ; //返回值
}
2、利用点语法给对象属性赋值的写法
#import <Foundation/Foundation.h>
#import "User.h" //定义main方法,作为程序入口
int main(int argc,char *argv[])
{
@autoreleasepool //自动释放池
{
User * user1=[[User alloc]init];
user1.name=@"Jereh"; //点语法给对象user1的属性name赋值
user1.sex=@"Male"; //点语法给对象user1的属性sex赋值
user1.age=; //点语法给对象user1的属性age赋值
[user1 createMyClass];
NSLog(@"\n姓名:%@\n性别:%@\n年龄:%ld\n",user1.name,user1.sex,user1.age); //打印用户信息,使用点语法来获取对象的属性
}
return ; //返回值
}
- 利用自定义构造方法来给对象赋值
1、首先来看一段代码
User.h文件:
1 #import <Foundation/Foundation.h>
2
3 @interface User : NSObject
4 @property NSString * name; //定义字符串变量
5 @property NSString * sex;
6 @property NSInteger age; //定义整型变量
7 /*********其他方法*********/
8 /**定义声明类的方法*/
9 - (void) createMyClass;
10 - (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age; //定义一个自定义构造方法,注意返回值类型和方法格式的书写
11
12 @end
User.m文件:
#import <Foundation/Foundation.h>
#import "User.h" @implementation User:NSObject
/**声明类的方法*/
- (void) createMyClass{
NSLog(@"声明一个名为User的类");
}
- (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age{
self = [super init]; //关于self和super详细解惑请参考:http://www.cnblogs.com/tangbinblog/p/4034890.html
if (self) {
_name=name;
_sex=sex;
_age=age;
}
return self;
}
@end
main.m文件:
#import <Foundation/Foundation.h>
#import "User.h" //定义main方法,作为程序入口
int main(int argc,char *argv[])
{
@autoreleasepool //自动释放池
{
User * user1=[[User alloc]initWithName:@"Jereh" andSex:@"Male" andAge:]; //自定义构造方法调用,替代init直接输入变量
[user1 createMyClass];
NSLog(@"\n姓名:%@\n性别:%@\n年龄:%ld\n",user1.name,user1.sex,user1.age); //打印用户信息,使用点语法来获取对象的属性
}
return ; //返回值
}
输出结果:
2、自定义构造方法使用注意事项
>>>1、在.h文件中,定义自定义构造方法时,返回值类型一般为instancetype,声明方法开头必须以initWithXxx:开始,严格按照驼峰法则命名。若需要同时声明多个属性的初始化,中间则必须用andXxxx连接,且必须使用驼峰法则命名。
>>>2、在.m文件中,实现自定义构造方法时,花括号里面的格式是固定的,其中self指的是当前对象的指针,[super init]意思是调用父类NSObject中的init方法返回一个初始化好的对象给self,加if判断当前对象不为空时,给当前对象的属性赋值,最后再把赋值好的对象返回给你在main.m中初始化的对象名称。
>>>3、自定义构造方法调用时,必须按照要求的格式进行书写,变量和变量类型必须匹配。
二、类方法和对象方法
- 类方法和对象方法的书写
1、首先先看下面的程序段:
User.h文件:
#import <Foundation/Foundation.h> @interface User : NSObject
@property NSString * name;
@property NSString * sex;
@property NSInteger age;
/**声明对象方法 */
- (void) createMyClass;
/**声明类方法 */
+ (void) createMyClass;
/**声明一个自定义构造方法方法 */
- (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age;
@end
User.m文件:
#import <Foundation/Foundation.h>
#import "User.h" @implementation User:NSObject
/**声明类的方法*/
- (void) createMyClass{
NSLog(@"这是对象方法输出的结果");
}
/**声明类方法 */
+ (void) createMyClass{
NSLog(@"这是类方法输出的结果");
}
/**实现自定义构造方法 */
- (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age{
self = [super init];
if (self) {
_name=name;
_sex=sex;
_age=age;
}
return self;
}
main.m文件:
#import <Foundation/Foundation.h>
#import "User.h" //定义main方法,作为程序入口
int main(int argc,char *argv[])
{
@autoreleasepool //自动释放池
{
User * user1=[[User alloc]initWithName:@"Jereh" andSex:@"Male" andAge:];
[user1 createMyClass];
[User createMyClass];
}
return ; //返回值
}
输出结果:
2、对象方法和类方法的异同
>>对象方法书写格式
>>>无返回值无参数的对象方法 -(void)方法名;
>>>无返回值有参数的对象方法 -(void)方法名:(参数类型)参数名;
>>>有返回值无参数的对象方法 -(返回值类型)方法名;
>>>有返回值有参数的对象方法 -(返回值类型)方法名:(参数类型)参数名;
>>对象方法调用
>>>[调用对象 对象方法名]
>>类方法书写格式
>>>无返回值无参数的类方法 +(void)方法名;
>>>无返回值有参数的类方法 +(void)方法名:(参数类型)参数名;
>>>有返回值无参数的类方法 +(返回值类型)方法名;
>>>有返回值有参数的类方法 +(返回值类型)方法名:(参数类型)参数名;
>>类方法调用
>>>[调用类 类方法名]
- 关于类方法和对象方法的使用
1、类方法是属于整个类的方法,而不属于某个对象,所以单个对象无法调用类方法
2、类方法无需定义成员变量就可以实现,但无法访问成员变量,即系统只会调用类方法,不会调用对象方法
3、类方法效率较高
4、对象方法必须有对象才可以实现
5、类方法不能被覆盖,对象方法则可以被覆盖
6、类方法的适用场合
>>1、当初始化对象的时候可以使用类方法
>>2、当该方法涉及不到成员变量的时候可以使用类方法
>>3、封装一些工具类的时候可以使用类方法
IOS学习笔记 O2的更多相关文章
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- IOS学习笔记之关键词@dynamic
IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
- iOS学习笔记之Category
iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...
- iOS学习笔记之ARC内存管理
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
随机推荐
- QT中的C/S通信问题:关于服务器端readyread()信号不发射
在windows下用QT测试C/S通信的时候,遇到服务器端不能读取客户端发来的数据的问题. 后来设置断点检查错误,发现是readyread信号不触发的原因. 后来在客户端写socket后面加了一句so ...
- poj 1691 图方块 end
#include<iostream> int m,n; typedef struct node { int upx,upy; int dox,doy; int c; }node; node ...
- MIME Type
一.首先,我们要了解浏览器是如何处理内容的.在浏览器中显示的内容有 HTML.有 XML.有 GIF.还有 Flash --那么,浏览器是如何区分它们,决定什么内容用什么形式来显示呢?答案是 MIME ...
- oracle合并版本
1) 添加字段,并自增 第一步:alter table TOWN add ID int 第二步:Update TOWN set id=rownum; Commit; 2) 更新表(另一张表) ...
- Versioned table in Netezza
Problem One QC process need to obtain tables and their row counts in a database in Netezza. We use t ...
- python中的告警处理
在Python中,遇到异常时,一类是直接抛出异常,exception:另一类直接告警warning. 对于后者,通常是打印一句话.前者则或中断程序执行. 考虑到避免由于告警导致后续的不可预知的错误,可 ...
- C语言字符串拷贝
C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...
- C# 根据前台校验的值,决定是否执行后台方法
<asp:Button ID="Add" runat="server" Text="加入" class="add" ...
- eclipse- Web-app verson=2.5 调整将Dynamic Web Module3.0降为2.5
如果提示cannot change version of project facet Dynamic Web Module to 2.5 1.把Dynamic Web Module复选框,勾选去掉,点 ...
- Myeclipse 安装离线adt的方法 ()
方法一: 1.下载最新的adt插件ADT-10.0.1.zip (在MyEclipse 10.5 上安装的ADT插件是ADT 20.0.3离线包下载地址: http://dl.cr173.com//s ...