现在的位置: 首页 > 综合 > 正文

黑马程序员——IOS基础——OC内存管理ARC

2018年05月26日 ⁄ 综合 ⁄ 共 1914字 ⁄ 字号 评论关闭

------- 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

------- android培训java培训、期待与您交流!

【上篇】
【下篇】

抱歉!评论已关闭.