码迷,mamicode.com
首页 > 移动开发 > 详细

iOS ARC机制

时间:2015-05-10 23:59:17      阅读:362      评论:0      收藏:0      [点我收藏+]

标签:

 iOS提供了ARC功能,很大程度上简化了内存管理的代码。

1、ARC的本质:

采用ARC后,iOS开发者完全可以抛弃之前繁琐的内存管理机制。在开启ARC的情况下,编译器会自动的在程序的正确位置隐式的插入retain,release和autorelease等。特别明确,ARC只是objective-C编译器的特征,所有ARC相关处理都会发生在构建应用程序的时候,这和内存垃圾回收机制不同。

2、基本的ARC使用规则

1)代码中不能使用retain,release,autorelease等;

2)不能在C语言结构体中使用对象指针;

3)不能重载dealloc,如果是释放对象内存以处外的处理,是可以重载该函数,但是不能调用[super dealloc];

4)不能使用NSAutoReleasePool、而是要使用@autoreleasepool块

3、ARC机制下的@property规则

strong:该属性值对应__strong关键字,即该属性所声明的变量将成为对象的持有者。

weak:该属性对应__weak关键字,该属性所声明的变量将没有对象的所有权,并且当对象被抛弃之后,对象将被自动复制nil;

copy:与strong的区别是声明变量拷贝的是对象的持有者。

转自特酷吧:http://www.tekuba.net/program/279/

 

但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。

一,循环参照

A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。

这种问题常发生于把delegate声明为strong属性了

1 @interface SampleViewController
2 @property (nonatomic, strong) SampleClass *sampleClass;
3 @end
4 
5 @interface SampleClass
6 @property (nonatomic, strong) SampleViewController *delegate;
7 @end

上例中,解决办法是把SampleClass 的delegate属性的strong改为assing即可。

二,死循环

如果某个ViewController中有无限循环,也会导致即使ViewController对应的view关掉了,ViewController也不能被释放。

这种问题常发生于animation处理。

1 CATransition *transition = [CATransition animation];
2 transition.duration = 0.5;
3 tansition.repeatCount = HUGE_VALL;
4 [self.view.layer addAnimation:transition forKey:"myAnimation"];

上例中,animation重复次数设成HUGE_VALL,一个很大的数值,基本上等于无限循环了。

解决办法是,在ViewController关掉的时候,停止这个animation。

-(void)viewWillDisappear:(BOOL)animated {
    [self.view.layer removeAllAnimations];
}

 

 

 

iOS ARC机制

标签:

原文地址:http://www.cnblogs.com/tz8023dm/p/4493380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!