傲视苍穹iOS《Objective-C》VIP专题好东西小知识点

iOS内存泄漏检测方法

2017-08-10  本文已影响365人  苦工

什么是内存泄漏,通俗来说就是有一块内存区域被你占用了,但你又不使用这块区域也不让别人用,造成内存浪费,这就是内存泄漏,泄漏严重会造成内存吃紧,严重的会使程序崩溃;
内存泄漏对于以前MRC开发来说相当痛苦,需要耗费大量精力管理内存,引入ARC机制后,系统自动管理内存,大大减轻了开发工作量,但一些特殊情况仍然会有内存泄漏发生,需要特别注意。

一般易造成泄漏的点

eg:

block循环

 [cell setSelectTagCityBlock:^(NSIndexPath *indexPath, NSInteger index){
        [self tableView:_tableViewCityList didSelectRowAtIndexPath:indexPath index:index];
    }];
    

一般用weak打破保留环

@WeakObj(self)
    [cell setSelectTagCityBlock:^(NSIndexPath *indexPath, NSInteger index){
        if (selfWeak)
        {
            [selfWeak tableView:selfWeak.tableViewCityList didSelectRowAtIndexPath:indexPath index:index];
        }
    }];
    

AFNetWorking上的经典代码,防止循环引用的

//创建__weak弱引用,防止强引用互相持有
__weak __typeof(self)weakSelf = self;
AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {
    //创建局部__strong强引用,防止多线程情况下weakSelf被析构
     __strong __typeof(weakSelf)strongSelf = weakSelf;
    strongSelf.networkReachabilityStatus = status;
    if (strongSelf.networkReachabilityStatusBlock) {
         strongSelf.networkReachabilityStatusBlock(status);
    }
};

weak 本身是可以避免循环引用的问题的,但是其会导致外部对象释放了之后,block 内部也访问不到这个对象的问题,我们可以通过在 block 内部声明一个 strong 的变量来指向 weakObj,使外部对象既能在 block 内部保持住,又能避免循环引用的问题

block 本身无法避免循环引用的问题,但是我们可以通过在 block 内部手动把 blockObj 赋值为 nil 的方式来避免循环引用的问题。另外一点就是 block 修饰的变量在 block 内外都是唯一的,要注意这个特性可能带来的隐患。



 _timer = [NSTimer timerWithTimeInterval:[refreshTime integerValue]
                                             target:self
                                           selector:@selector(doFSearchDoubleBackNumberRequest:)
                                           userInfo:searchResult
                                            repeats:NO];
            [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
            

Timer 添加到 Runloop 的时候,会被 Runloop 强引用。
Timer 又会有一个对 Target 的强引用。
所以说如果不对Timer进行释放,Timer的targer(self)也一直不会被释放。
有时候我们我们对某个Timer的targer设置了nil。但没设置[timer invalidate]。
其实这个对象还是没被释放的。timer对应的执行方法也一直会在线程中执行。容易造成内存泄露。

注:repeats:NO不会强引用
常规的监测方法
上一篇下一篇

猜你喜欢

热点阅读