这就是我学到的:使用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

最佳答案

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);
    }
});

关于ios - 我是否需要强壮自我来保持自我活力,强壮自我真的有效吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29093677/

10-11 12:11