好吧,我们知道如果这样做,我们可能会有一个保留周期

[someObject messageWithBlock:^{ [self doSomething]; }];


而且解决方案是这样的

__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{ [weakSelf doSomething]; }];


但是,如果我们执行最后的代码,但是doSomething有很多关于self的引用,那该怎么办?喜欢:

- (void) doSomething {
    self.myProperty = @"abc";
    [self doOtherThing];
}


这样会形成保留周期吗?

那呢:

__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{
   self.onError(NSLocalizedStringFromTable(@"Error", MY_TABLE, nil))
}];


MY_TABLE在哪里是#define

最佳答案

此代码中没有保留周期:

__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{ [weakSelf doSomething]; }];

- (void) doSomething {
    self.myProperty = @"abc";
    [self doOtherThing];
}


说明

在上面的代码中

[weakSelf doSomething];


表示接收者对象(自身)现在已经变为weakSelf,即。在doSomething内部对self的任何调用都将指向weakSelf。
因此,在doSomething中引用self不会创建保留周期。

谈论下面的代码:

__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{
   self.onError(NSLocalizedStringFromTable(@"Error", MY_TABLE, nil))
}];


因为块内的接收者对象是self,而不是weakSelf,所以这将创建一个保留周期。

关于ios - 块的保留周期是否适用于块调用的方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43084167/

10-12 22:13