从块中调用的方法是否需要使用 weakSelf?

Do methods called from within a block need to use weakSelf?

如果块内的代码调用了一个方法,如果该方法引用了self,是否会存在循环引用?换句话说,是否所有块的下游代码都需要使用 weakSelf/strongSelf 模式?

例如:

__weak __typeof__(self) weakSelf = self;
Myblock block = ^{
    [weakSelf doSomething];
};

。 . .

- (void)doSomething
{
    self.myProperty = 5; // Is this ok or does it need to use a weakSelf?
}

Objective-C 没有像您建议的那样限定范围,也就是说,您无权从 -doSomething 中访问 weakSelf。此外,当您在 weakSelf 上调用 -doSomething 时,该调用中的 "self" 实际上指的是与 weakSelf 相同的对象。

简而言之,不,你不应该,你不能也不应该。

您可以这样做来摆脱保留循环问题。

[self class] __weak *weakSelf = self;
self.completionBlock = ^{
    [self class] __strong *strongSelf = weakSelf
    [weakSelf doSomething];
};

只有当你在块中保留自己时,才会触发保留循环。否则它只会发出警告。

很好,你可以用这个。因为块保留了内部使用的每个变量,所以保留循环就像

  1. 自己会保留区块
  2. 如果块保留自身则
  3. 自己会再次保留区块
  4. 块会保留自己,所以循环继续

你在方法中所做的只是消息传递。每次块被调用时,都会向自己发送一条消息来做某事。并且您可以在 doSomething 方法中保留自我,它不会触发保留循环,因为此方法没有自我循环。希望你明白:)

  - (void)doSomething
 {
       self.myProperty = 5; // Is this ok or does it need to use a weakSelf?
  }