------- android培训、java培训、期待与您交流!
ARC的判断准则:
只要有强指针指向对象,对象就不会被销毁,
只要有弱指针指向对象,对象就会被销毁
强指针:默认情况下,所有指针都是强指针 __strong 这里是双下划线弱指针: __weak Person *p2=[[Person alloc] init]; (这种写法没有意义,错误写法)
如果弱指针指向一个对象,那么这个对象会被销毁,弱指针指向对象不存在,把弱指针编程空指针,以防野指针
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
设置成员变量的@property属性时,默认为atomic,提供多线程安全。
在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:{lock}//加锁
if (property != newValue) {
[property release];
property = [newValue retain];
}
{unlock}//解锁 atomic是OC使用的一种线程保护技术,是防止在写未完成的时候被另外一个线程读取,造成数据错误,而这种机制是耗费系统资源的。
nonatomic禁止多线程,变量保护,提高性能。
所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
@property (nonatomic strong) Dog *dog; //人在狗在
@property (nonatomic weak) Dog *dog; //
Dog *d = [[Dog alloc] init];
Person *p = [[Person alloc] init];
p.dog = d;
//如果是strong,则d=nil后,依然可以调用p.dog 如果是weak,则d=nil后,狗就不在了,则访问p.dog返回空
d = nil; //人在狗在用strong
总结ARC特点总结:
1.>不允许调用release、retain、retainCount
2.>允许重写dealloc,但是不允许调用[super dealloc]
3.>@property参数:
* strong :成员变量是强指针,相当于原来的retain(适用于OC对象类型),只要指针在,对象就在
* weak :成员变量是弱指针,相当于原来的assign(适用于OC对象类型)
* assign :使用与非OC对象类型
4.> 以前的retain改为用strong
写法如下:
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int age;
如何:查看一个项目是否是ARC项目:在Build Settings 中搜auto,
如何:把一个项目转换成ARC项目:把所有release去掉,把retain变成strong
edit -> refactor -> convert to Object-C ARC如何:在一个ARC项目中不使用ARC:
在Build Phases中:找到不适用ARC的文件,双击/空格/回车 出现方框,输入:-fno-objc-arc
如何:在一个非ARC项目中使用ARC:
方法同上:输入:-f-objc-arc
===============================ARC循环引用=============================
在Person.h 和 Dog.h 中不能都声明strong:
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) Person *person;
一端用strong,一端用weak,不限制谁用weak,这样弱指针指向的对象会先销毁,另一端若没有指针指向,则也会销毁。
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, weak) Person *person;
所以,当两端循环引用的时候,解决方案:
ARC:
1端用strong,1端用weak
非ARC:
1端用retain,1端用assign