一.属性@property
description:首先属性规定了类所具有某些特定特征,而用property修饰过的属性则默认把该属性的setter和getter方法也申明并实现了,可以在其他地方调用从而实现对该属性的取赋值。
语法要求:`@porperty (属性修饰符) int age `;
属性修饰符:在括号中可以有以下几种常用的修饰符
nonatomic:非原子性,可打断的。
atomic 原子性,不可打破的,不可分割的最小单位。非原子性与原子性都是对与线程来说的,一般来说,我们用nonatomic,因为这样的效率比atomic会高,对于单线程来说是没一点问题的用nonatomic,而用多线程的时候,就会出现一点问题,举个例子就是当你给一个属性赋值的时候,如果使用了原子性的修饰符那么就会有俩种情况要么付给了一个确定的值,要么没有赋值,而你使用非原子性的时候,由于多线程的关系就可以打断阻塞你现在正在执行的赋值的线程,造成结果和想象中的不一样,所以它是不安全的,但是,当我们用多线程的时候会采取另一种技术叫线程锁,来控制线程,所以实际中我们一般都写非原子性就可以了。
assign, retain, copy: 针对对象使用,根据 setter 方法内部实现时对传入的对象的持有方式。retain 会增加引用计数,强引用类型, assign 是给变量直接赋值,弱引用类型,也是默认值, copy 是把 setter 的参数复制一份再赋给成员变量。注意它们对引用计数产生的影响,如果外部不再使用的话,用了 retain 或 copy 赋值的可以release 掉那个对象。是NSString用copy,delegate用assign(且一定要用assign,不要问为什么,只管去用就是了,以后你会明白的),非objc数据类型,比如int,float等基本数据类型用assign(默认就是assign),而其它objc类型,比如NSArray,NSDate用retain。
readonly 只读性
readwrite 读写性
getter,setter getter=getterName 和setter=setterName显式设置 getter/setter 方法名, 未指定它们时 Objective-C 会为我们生成默认的 setter/getter 方法, 有一定的规则,比如上面的 NSString* gender 属性生成默认的setter 方法是: -(void) setGender:(NSString *);getter 方法是: -(NSString *) gender;
修饰符分别是retain ,copy,assign时,系统默认生成的setter方法
//retain 时:
-(void) setAddress: (Address *) address {
if(_address){
[_address release];
}
_address = [address retain];
}
//assign 时:
-(void) setAddress: (Address *) address {
self.address = address;
}
//copy 时:
-(void) setAddress: (Address *) address {
if(_address){
[_address release];
}
self.address = [address copyWithZone: zone];// Address 必须实现 NSCoping 协议
}
二.类别Category
description:类别一般用于为某个类添加一些方法。
类别的分类:
1、 一种 类别:有名类别
2、一种 类别:匿名类别 类的延展(Extension)
注意事项:
1、有名类别只能扩展方法 不能扩展成员变量
2、使用类别中的方法 需要导入类别的头文件
3、类别 中添加的方法 其实跟在 类中直接添加没有区别 类别中的方法能够调用 成员变量
使用:
一般是在类的源文件代码不对外公开 或者 你压根就不需要知道源文件代码写什么了的情况下使用