@property基础知识

802 阅读2分钟

@property是我们一直在用的,但是我对此并不了解,只知道copy一般用来修饰NSString、block,assign用于修饰基本类型,但是如果再深入问下去,就什么都不知道了。
这篇文章不包括copy关键字,copy关键字在上一篇文章

1. @property的本质

@property的本质是ivar+getter+setter。再编译期间自动生成getter和setter,还自动向类中添加适当类型的实例变量,也可以用@synthesize来指定实例变量的名字。

2. 与多线程相关的

a) atomic,在生成的setter方法会被加上一把自旋锁。不能保证线程绝对安全,而且消耗系统性能,不建议使用。
b) nonatomic。不加自旋锁,高效率。

3. 与生成的setter方法相关的:assign、retain

a) assign: 默认值,生成的setter方法就是直接赋值。
b) retain: 生成的setter方法就是标准的MRC内存管理代码。也就是先判断新旧对象是否为同一个对象,如果不是,release旧的,retain新的。

4. 与读写权限相关的

a) readwrite:生成getter方法、setter方法;
b) readonly:生成getter方法

5. 与getter、setter方法名相关的:直接写getter=xxx

6. 自定义getter、setter写法

image.gif

7. MRC下的setter、dealloc写法

image.gif

8. strong与weak

a) strong是一个强引用,使对象引用次数加1,weak是一个弱引用,不会让对象引用次数加1,当对象引用次数为0时,对象自动释放。

b) 在ARC机制下,2个对象互相引用的时候,如果两边使用strong,那么会发生内存泄漏
解决方法:1端使用strong,1端使用weak.\

9. 默认修饰符

1)基本数据类型:atomic,readwrite,assign

2)OC对象:atomic,readwrite,strong

10. weak和assign的区别

assign主要用来修饰基本数据类型,如NSInteger,CGfloat,int,id。weak主要用来修饰OC对象,比如UIButton,UIView等。

1)相同点:assign和weak不会牵扯到内存管理,也不会增加引用计数。
2)不同点:assign可修饰基本数据类型,也可修饰OC对象,但是当对象释放时,必须手动设置nil,否则就会产生野指针;weak只可以修饰OC对象,当对象释放时,自动把自己设置成nil,不会产生野指针。
2)为什么assign修饰的基本数据类型没有问题?因为基本数据类型分配的控件都是在栈上,栈空间的分配和回收都是系统处理的,不会产生野指针问题。

使用建议:
1)在ARC机制下,如果属性是可变OC对象,绝大多数使用strong,解决引用循环时用weak
2)在ARC机制下,如果属性是不可变OC对象,绝大多数使用copy
3)在ARC机制下,如果属性不是OC对象,使用assign
4)在MRC机制下,将strong替换为retain