关于深入研究block 出现循环引用的问题和内存泄漏

最近一段时间在研究

ReactiveCocoa 很不错的第三方库,但是在此之前,我想深入的去了解一下block ,当我想去深入的了解block的时候,我突然发现原来很多基础的知识,有点记不清楚了,

关于引用计数的一些问题,还有就是强引用和弱引用,我就一起笔记一下要点,还有就是循环引用,这些估计大部分的blog里面都有提到,我就简单的做下笔记和大家,

循环引用的会出现的现象就是创建的对象释放不了,因为引用计数没有变成0,没有变成0的原因的相互都是Strong了对方,编译器会查询该对象的引用计数是否为0来判断时候去

释放该对象,当相互被Strong的话就会造成谁也别想走。

用过block的应该都知道 , block的执行里面 如果,调用了self 或者是 nslog(该类的属性)的时候汇报应用循环的警告,当然有的博客说,在执行体里面使用_xxx属性的话也是会,但是我想说不会,当然如果你要在nslog(_xxx)使用是会报应用循环的错误,针对这些我也做了实验。还有一个问题就是作用域的问题,在block的执行体里面,他的效果是在包涵他的方法里面吗,这个问题我也用先提出我的猜测,如果一个方法里面执行block的函数体里执行Self的时候,就只是在该方法里面的进行引用计数+1,当然你说这是废话,但是block回调是调用的依附在保存他的对象里面。我就进一步的猜测,对象是放在堆里面的而执行的方法是放在栈里面的,估计有点晕了吧 ,好了我们直接上代码,


关于深入研究block 出现循环引用的问题和内存泄漏_第1张图片


- (void)showMySelf{

    NSLog(@"%@",self);

}



说明在该栈空间里面block里面执行了retain 操作,如果在另一个栈空间(方法)就不会,是不是呢?我们反汇编说话,

关于深入研究block 出现循环引用的问题和内存泄漏_第2张图片

并没有在 该函数里面进行一个retain,再看看buttonAction 里面是怎样的

关于深入研究block 出现循环引用的问题和内存泄漏_第3张图片

blockViewController这个对象被retain了,这就是说block里面有blockViewController ,blockViewController又有block这样你有我我有你,就是好基友了,哈哈哈,加个方法,就可以破坏他们之间亲密的关系,感觉好神奇啊,关于底层的知识自己还有很多不是十分清楚的,记一记笔记,至少会回想的更快。



你可能感兴趣的:(iOS,开发)