1

如果块内的代码调用了一个方法,如果该方法引用了self,是否存在retain循环?换句话说,一个块下游的所有代码都需要使用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?
}
4

3 回答 3

2

Objective-C 的范围不像您建议的那样,即您无法从-doSomething 中访问weakSelf。此外,当您在weakSelf 上调用-doSomething 时,该调用中的“self”实际上指的是与weakSelf 相同的对象。

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

于 2015-02-21T21:14:24.770 回答
1

仅当您将 self 保留在块内时,才会触发保留周期。否则它只会发出警告。

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

  1. 自我会保留块
  2. 如果块保留自我,那么
  3. 自我将再次保留块
  4. 块会保留自我,所以循环继续

您在方法中所做的只是消息传递。每次调用块时,都会向自己发送一条消息以执行某项操作。并且您可以在 doSomething 方法中保留自我,它不会触发保留循环,因为该方法没有自我循环。希望你能理解 :)

  - (void)doSomething
 {
       self.myProperty = 5; // Is this ok or does it need to use a weakSelf?
  }
于 2015-03-05T10:57:40.520 回答
0

你可以这样做来摆脱保留周期问题。

[self class] __weak *weakSelf = self;
self.completionBlock = ^{
    [self class] __strong *strongSelf = weakSelf
    [weakSelf doSomething];
};
于 2015-03-04T14:21:32.143 回答