转载一篇: iOS开发ARC内存管理技术要点、ARC内存管理原则总结、iOS ARC内存管理总结
ARC内存管理机制
(一)ARC的判断准则:
只要没有任何一个强指针指向该对象,该对象就会被释放。
(二)指针分类:
(1)强指针:强指针使用关键字__strong修饰,默认的情况下,所有的指针都是强指针,即不加__strong,该指针变量就是强指针
(2)弱指针:弱指针则由__weak关键字显式地修饰
声明一个弱指针:__weak Person *p;
ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作,即*p = nil;。
__weak Person *p=[[Person alloc] init];
上面的代码存在问题:对象一被创建出来,就被立即释放掉了,这是因为该对象被创建出来后,没有被任何强指针所指着,ARC就立即把对象释放掉,并且ARC还自动把指针p清零
ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc],否则,会报错。
@property(nonatomic,strong)Dog *dog; // 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
如果想生成的成员变量_dog是一个弱指针,则把strong换成weak即可。
(三)ARC的特点总结:
(1)不允许调用release,retain,retainCount
(2)允许重写dealloc,但是不允许调用[super dealloc]
(3)@property的参数:
strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
assign:适用于非OC对象类型(基本数据类型)
(四)补充
让程序兼容ARC和非ARC部分。转变为非ARC -fno-objc-arc 转变为ARC的, -f-objc-arc 。
ARC也需要考虑循环引用问题:一端使用retain,另一端使用assign。
提示:字符串是特殊的对象,但不需要使用release手动释放,这种字符串对象默认就是autorelease的,不用额外的去管内存。