iOS ARC机制
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]; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。