点语法
利用点语法替换set方法和get方法
方法调用
Person *p = [Person new];
[p setAge:20];
int age = [p age];
点语法
p.age = 20;
int age = p.age;
其实点语法的本质还是方法调用,当使用点语法的时候,编译器会自动展开成相应的方法。
p.age = 10;
展开为
[p setAge:10];
int age = p.age;
展开为
int age = [p age];
注意死循环
- (void) setAge:(int)age{
//会引发死循环
// self.age = age;
//上一句相当于[self setAge:age];
_age = age;
}
-(int)age
{
//会引发死循环
//return self.age;
//上一句相当于[self age];
return _age;
}
@property 和 @synthesize
@property:可以自动生成某个成员变量的setter和getter声明
@property int age;
@synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量,如果不存在,就会自动生成@private类型的_age变量
而现在的@property直接包含了@synthesize的功能,更加简洁了
@property的相关参数
1.set方法内存管理相关的参数
> retain : release旧值,retain新值(适用于OC对象类型)
> assign : 直接赋值(默认,适用于非OC对象类型)
> copy : release旧值,copy新值
2.是否要生成set方法
> readwrite : 同时生成setter和getter的声明、实现(默认)
> readonly : 只会生成getter的声明、实现
3.多线程管理
> nonatomic : 性能高 (一般就用这个)
> atomic : 性能低(默认)
4.setter和getter方法的名称
> setter : 决定了set方法的名称,一定要有个冒号 :
> getter : 决定了get方法的名称(一般用在BOOL类型)
@property(nonayomic,assign) int age;
构造方法
构造方法:用来初始化对象的方法
重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值
注意
再重写init方法时要先调用父类的构造方法[super init]
之后进行子类成员变量的初始化
创建对象方法
Person *p1 = [Person alloc] 分配储存空间
Person *p2 = [p1 init]; 初始化
Person *p3 = [[Person alloc]init]; 把两步一起进行
重写init
- (id)init
{
if(self = [super init]){
_age = 20;
}
return self;
}
分类
分类的作用
在不改变原来类内容的基础上,可以为类增加一些方法
@interface 类名 (分类名)
@end
使用注意
1.分类只能增加方法,不能增加成员变量
2.分类方法实现中可以访问原来类中声明的成员变量
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
4.方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类 --> 父类
分类与继承的区别
(1)category是在不改变原来类内容的基础上,为类增加一些方法,但不能增加成员变量,
只是将原来类的方法进行模块化管理,而继承是新建一个类,这个类可以拥有父类的方法和不是私有成员的变量,
还可以在原来的基础上增加成员变量和方法;
(2)在category中对原有类的方法进行重载,会覆盖原来的方法,会导致原来方法失效无法再使用,而在
继承中实现父类方法的重载时可以使用super调用父类的方法;
(3)category是可以被继承的。在某个父类中定义了category,那么他所有的子类都具有该category;
协议
协议(protocol)是Objective-c中一个非常重要的语言特性,从概念上讲,非常类似于JAVA中接口. 一个协议其实就是一系列有关联的方法的集合(为方便后面叙述,我们把这个协议命名为myProtocol)。协议中的方法并不是由协议本身去实现,相反而是由遵循这个协议的其他类来实现。换句话说,协议myProtocol只是完成对协议函数的声明而并不管这些协议函数的具体实现
协议的定义
@protocol 协议名称 <NSObject>
// 方法声明列表....
@end
如何遵守协议
1> 类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2>
@end
2> 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end
协议中方法声明的关键字
1> @required (默认)
要求实现,如果没有实现,会发出警告
2> @optional
不要求实现,怎样不会有警告
一些使用
定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
@property中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称> 属性名;
@property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2;
协议可用定义在单独.h文件中,也可用定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中
2> 如果这个协议用在很多类中,就应该定义在单独文件中
7.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
1> 一般情况下,都是定义在单独文件
2> 定义在原来类中的分类,只要求能看懂语法