@property和ARC
@property和ARC都是编译器特性,系统会帮我们自动生成代码
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类型)
ARC
即自动引用计数器,全名是Automatic Reference Counting,简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。
该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可以使用该机能。简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码
引用关键字
指针分2种:
1 强指针:默认情况下,所有的指针都是强指针 __strong
2 弱指针:__weak
ARC的判断准则:只要没有强指针指向对象,就会释放对象
ARC特点
1 不允许调用release、retain、retainCount
2 允许重写dealloc,但是不允许调用[super dealloc]
3 @property的参数
1> strong :成员变量是强指针(适用于OC对象类型)
2> weak :成员变量是弱指针(适用于OC对象类型)
3> assign : 适用于非OC对象类型
4 以前的retain改为用strong
__weak Person *p = [[Person alloc] init]
表示定义了一个被弱指针指向的对象,在ARC中一创建出来就会被回收,错误的写法
循环引用
当两端循环引用的时候,解决方案:
ARC
1端用strong,另1端用weak
非ARC
1端用retain,另1端用assign