• iOS ARC也会有内存泄露


    本文转载至 http://blog.csdn.net/allison162004/article/details/38753219 

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

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

    下面列举两种内存泄露的情况。

    1,循环参照

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

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

    例,

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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即可。

    ARC通过记录指向某对象的指针数量来判断该对象是否应该被释放(0代表可以释放)。因而如果出现循环引用,就会出现内存泄露。如下图所示。

     取消3->2的引用   导致泄露。

    ARC的解决办法也和简单,使用弱引用(weak reference)。弱引用的申明方式举例如下:
    id __weak P;
    @property (weak) NSVIew *V;
    还是以上面的例子做对比,结果如下:

     弱引用不增加计数, 从而消除leak。


    2,死循环

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

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

    例,

    比如,

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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。

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. -(void)viewWillDisappear:(BOOL)animated {  
    2.     [self.view.layer removeAllAnimations];  
    3. }  

    内存泄露的情况当然不止以上两种。

    即使用了ARC,我们也要深刻理解iOS的内存管理机制,这样才能有效避免内存泄露。

  • 相关阅读:
    CSS3旋转动画
    CSS3的动画属性
    CSS选择器
    JS事件委托
    js 轮播图效果
    JS事件冒泡和事件捕获
    JS自定义播放器
    js闭包for循环只执行最后一个值得解决方法
    交通红绿灯
    汉明距
  • 原文地址:https://www.cnblogs.com/Camier-myNiuer/p/4165468.html
Copyright © 2020-2023  润新知