在我们的编写代码的时候, 常常会出现一些循环引用的问题, 今天就说说 block 的循环引用, 引起的对象无法被释放的问题
先说一下我们验证问题的方法:
- -1.Navigationcontroller嵌套vc1; -2.由vc来push vc2; 当vc2 pop控制器的时候会释放vc2对象
下面是 vc2 中主要代码:
- #import "ViewController.h"@interface ViewController()@property(nonatomic, copy) void( ^ block)();@end@implementation ViewController - (void) viewDidLoad { [super viewDidLoad]; // 定义一个block void (^task)() = ^{ NSLog(@"%@",self); }; // 赋值 self.block = task; // 执行block self.block();}// 查看对象是否销毁- (void)dealloc{ NSLog(@"ViewController再见");}
这个时候 pop,vc 的 dealloc 方法不会被调用, 因为在 block 中, 获取了 self 自身, 而 block 是 self 创建的一个属性, 造成了循环引用的技术问题
这时, 我们的解决方法就是:
这样做的目的是, 在 block 中不要有强指针指向 self, 用一个弱指针来代替 self, 可以获取到 self 的同时, 也不影响 self 的生死
有 3 中方法创建需要的弱指针:
- // 方式01__weak typeof(self) weakSelf = self; // 方式02__weak ViewController *weakSelf = self; // 方式03 (这种方式已经不再使用了 而且快速访问和返回 会导致野指针访问)__unsafe_unretained typeof(self) weakSelf = self;
同理, 在 block 中引用 self 的成员变量也会造成循环引用问题, 解决方法同上.
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/02-23/17429589.html