zoukankan      html  css  js  c++  java
  • iOS 容易引“起循环引用”的三种场景

    一、parent-child相互持有、委托模式
    【案例】:

    @interface FTAppCenterMainViewController ()
    {
    }

    @property(weak,nonatomic) UITableView* myTableView;
    @end
    这里面的myTableView就使用了weak修饰符。
    @property (nonatomic, weak) iddelegate;
    【推荐方法】:

    child只有parent的对象为weak类型:

    @property (nonatomic, weak) iddelegate;
    二、block
    【案例】:

    看下面的代码:

    typedef void (^RequestNaviCallBack)(NSInteger naviCode,NSInteger httpCode,NSError * error);
    @interface FtNaviManager : NSObject
    {
    }
    @property (nonatomic, strong) RequestNaviCallBack naviCallBack;
    这是一个请求导航的类,类属性持有了RequestNaviCallBack,这时,如果RequestNaviCallBack再持有self,必然造成循环引用。
    【推荐方法】:

    如果有循环引用,编译器会提示警告。
    如果对象没有持有Block对象,那么不会产生循环引用。如果对象持有了block对象,那么在block引用self的时候这么定义:

    __weak typeof(self) weakSelf = self;
    三、NSTimer
    【案例】:

    @interface FtKeepAlive : NSObject
    {
    NSTimer* _keepAliveTimer; // 发送心跳timer
    }
    //实现文件
    _keepAliveTimer = [NSTimer scheduledTimerWithTimeInterval:_expired target:self selector:@selector(keepLiveStart) userInfo:nil repeats:YES];
    类持有了_keepAliveTimer,_keepAliveTimer又持有了self,造成循环引用。

    【推荐方法】:

    NSTimer会持有对象,所以:在删除对象之前,需要将timer的invalidate方法。

    -(void)stopKeepAlive{
    [_keepAliveTimer invalidate];
    _keepAliveTimer = nil;
    }

    On the road。。。
  • 相关阅读:
    HDU 1010 Tempter of the Bone(DFS剪枝)
    HDU 1013 Digital Roots(九余数定理)
    HDU 2680 Choose the best route(反向建图最短路)
    HDU 1596 find the safest road(最短路)
    HDU 2072 单词数
    HDU 3790 最短路径问题 (dijkstra)
    HDU 1018 Big Number
    HDU 1042 N!
    NYOJ 117 求逆序数 (树状数组)
    20.QT文本文件读写
  • 原文地址:https://www.cnblogs.com/ianhao/p/4522410.html
Copyright © 2011-2022 走看看