ios开发基础学习笔记(十一)--@property的使用
前言
大家好,我是milo,今天这篇文章讲的是@property在MRC和ARC下的使用和对比。
@property的参数
(1)线程方面
atomic(默认):几乎不用,低性能 ,仅能保证读写安全(通过互斥锁),并不能保证线程安全。
nonatomic:高性能,一般使用这个。
(2)内存管理方面
1.MRC
1> assign (默认): 基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端用assign,多对象时,也只需保持一端assign
2> copy : 只用于NSString\block
3> retain : 除NSString\block以外的OC对象
2.ARC
1> assgin(默认) : 基本数据类型、枚举、结构体(非OC对象)
2> copy : 只用于NSString\block
3> strong : 除NSString\block以外的OC对象(相当于retain)
4> weak : 用于UI控件和delegate。当2个对象相互引用,一端用strong,一端用weak,多对象时,也只需保持一端weak(weak是弱引用,没有引用时释放内存和指针)
!!!内存管理需要注意的地方:内存管理的关键字是通过在setter/getter方法里生成相关代码来实现内存管理的。
如:
当我们使用retain的时候:
@property(nonatomic,retain) Dog *dog;
实际上,setter/getter方法就变成了如下:
- (void)setDog:(Dog *)dog
{
if(_dog != dog){ //判断是否需要重新赋值
[_dog release]; //释放旧引用,计数器-1
_dog = [dog retain]; //重新赋值,计数器+1
}
}
跟我们所学的自己写的retain的管理一模一样(包括使用atomic上锁也是在setter/getter里面加@synchronized)
在这里就不展开逐个验证了,就上个结论:
1.retain:先release旧值,再retain新值
2.assign:直接赋值,不考虑内存管理。
3.copy:先release旧值,再copy新值,copy的本质为复制该内存所存储的内容,重新创建一个对象赋给其相同的内容,很明显,在copy这个过程中也发生了一次retain,不过这是个全新的对象。
(3)是否生成setter方法
readwrite(默认):同时生成setter和getter的声明和实现
readonly:只读,只会生成getter的声明和实现
(4)Set和get方法的名称
修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用在布尔类型中的getter。
@propery(nonatomic,getter=isRich) BOOL rich;
BOOL b=p.isRich;// 调用
如果要修改set方法,记得在方法后面加个 “ :” ,因为set是带参数的,如:
@propery(nonatomic,setter=setIsRich:) BOOL rich;