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

时间:2015-02-21 21:11:39

标签: objective-c objective-c-blocks retain-cycle

如果块内的代码调用方法,如果该方法引用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?
}

3 个答案:

答案 0 :(得分:1)

Objective-C不像您建议的那样作用域,即您无法从-doSomething内访问weakSelf。此外,当你在weakSelf上调用-doSomething时,该调用中的“self”实际上指的是weakSelf所在的同一个对象。

总之,不,你不应该,你不能,你不应该。

答案 1 :(得分:1)

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

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

  1. Self会保留阻止
  2. 如果阻止自我,那么
  3. Self会再次保留阻止
  4. 块将保留self,因此循环继续
  5. 你在方法中所做的只是消息传递。每次调用块都会将消息发送给自己做一些事情。并且你可以在doSomething方法中保留self,它不会触发保留循环,因为这个方法没有自循环循环。希望你理解:)

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

答案 2 :(得分:0)

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

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