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];
}

 

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