这就是我所学到的:当使用self
保留块
weakSelf
来打破保留周期strongSelf
来阻止self
成为零中途所以我想测试strongSelf
是否真的可以让self
保持活着:
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"viewDidLoad");
self.test = @"test";
NSLog(@"%@",self.test);
__weak typeof(self)weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
__strong typeof(weakSelf)strongSelf = weakSelf;
strongSelf.test = @"newTest";
NSLog(@"%@",strongSelf.test);
});
}
- (void)dealloc {
NSLog(@"dealloc");
}
@end
ViewController将被推送到navigationController并立即弹出。输出是
为什么空?
还有一个问题我有一个项目,其中包含大量的weakSelf
没有strongSelf
的块,我收到大量信号11崩溃。它有关系吗?是否值得为每个人添加strongSelf
?
答案 0 :(得分:1)
strongSelf
确保如果self
尚未发布,则在执行该块时不会发生。
如果在创建strongSelf
之前自我消失了,那就是零。
如果strongSelf
确实包含某些内容,您应该检查:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
typeof(weakSelf)strongSelf = weakSelf; // __strong is not needed
if(strongSelf){
strongSelf.test = @"newTest";
NSLog(@"%@",strongSelf.test);
}
});
答案 1 :(得分:0)
块中的代码在3秒延迟后执行。所以到了这个时候,弱者自己已经是零了。这就是为什么strongSelf是零的原因
答案 2 :(得分:0)
我认为你没有解决问题。使用weakself将打破保留周期,但是这一行:
__strong typeof(weakSelf)strongSelf = weakSelf;
在执行块之前,不捕获对self的强引用。因此,如果您在块之外的VC指针为nil,则VC将被释放,当您点击块时,weakSelf将为零 - 这意味着您的strongSelf也将为零。捕获强大的参考仅保证如果你在块的开始处有弱自我,你将拥有它直到结束并且它不会同时是dealloc。但是如果在块的开始时weakSelf为零 - strongSelf也将为零。此外,您不需要将其声明为强大的内部块,因为它将根据定义强大,因此可以替换为:
typeof(weakSelf)strongSelf = weakSelf;
或
id strongSelf = weakSelf;