为什么block 里面使用self,instruments leaks 没有检测出内存泄漏?需要用什么方法才能检测出
博亿娱乐平台下载
博亿娱乐平台下载
当前位置 : 博亿娱乐平台下载 > 博亿国际娱乐

为什么block 里面使用self,instruments leaks 没有检测出内存泄漏?需要用什么方法才能检测出

① 为什么block 里面使用self,instruments leaks 没有检测出内存泄漏?
② 那么需要用什么方法才能检测出这里是出现了内存泄漏,因为一直都是网上这么说的,自己检测就不出来了。

下面事例代码:


#import "ViewController.h"

typedef void^myBlockNSString *;

@interface ViewController 

@propertynonatomic, copy myBlock BlockName;

@property nonatomic, copy NSString  *name1;
@property nonatomic, copy NSString  *name2;
@property nonatomic, strong NSMutableArray  *students;


@end

@implementation ViewController

- voidviewDidLoad {
    [super viewDidLoad];

    /// 问:为什么instruments leaks 没有检测出内存泄漏?
    /// 那么需要用什么方法才能检测出这里是出现了内存泄漏,因为一直都是网上这么说的,自己检测就不出来了。
    self.BlockName = ^NSString *ken{
        self.name1 = ken;
        self.name2 = ken;
        [self.students addObject:self.name1];
        [self.students addObject:self.name2];
    };
    
    self.BlockName@"apple";
}

@end

在block使用self实际上是循环引用,也就是相对于ARC情况下两个对象之间进行了强引用,虽然彼此都没有释放内存,但是彼此都是被引用者。目前Xcode 8中使用runtime调试可以看到内存的关系图,可以通过关系图找到循环引用的两个对象。

__weak __typeofself weakSelf=self;
    dispatch_time_t time = dispatch_timeDISPATCH_TIME_NOW, 6ull * NSEC_PER_SEC;
    NSLog@"waited at least 6s.";
    dispatch_aftertime, dispatch_get_main_queue, ^{
        __strong __typeofweakSelf strongSelf=weakSelf;
        if strongSelf {
            NSLog@"Oh,shit. self is not nil";
        }else
        {
            NSLog@"Congratulations";
        }

    };
    
将上段代码放在viewDidLoad里面即可。push这个vc,6秒内pop掉,等待log。

栏目列表

广告位

博亿娱乐平台下载