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

Objective c 从块内调用的方法是否需要使用weakSelf?,objective-c,objective-c-blocks,retain-cycle,Objective C,Objective C Blocks,Retain Cycle,如果块中的代码调用一个方法,如果该方法引用self,是否会存在保留周期?换句话说,块下游的所有代码都需要使用weakSelf/strongSelf模式吗 例如: __weak __typeof__(self) weakSelf = self; Myblock block = ^{ [weakSelf doSomething]; }; Objective-C的范围并不像你建议的那样,也就是说,你不能从剂量内接触到weakSelf。此外,当您在weakSelf上调用-doSomethin

如果块中的代码调用一个方法,如果该方法引用self,是否会存在保留周期?换句话说,块下游的所有代码都需要使用weakSelf/strongSelf模式吗

例如:

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


Objective-C的范围并不像你建议的那样,也就是说,你不能从剂量内接触到weakSelf。此外,当您在weakSelf上调用-doSomething时,该调用中的“self”实际上是指weakSelf所在的同一对象


简言之,不,你不应该,你不能,你不应该。你可以这样做,以摆脱保留周期的问题

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

仅当您将自身保留在块内时,才会触发保留循环。否则它只会发出警告

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

  • 赛尔夫将保留区块
  • 如果块保持自身,则
  • 赛尔夫将再次保留该区块
  • 块将保留自身,所以循环继续
  • 您在方法中所做的只是消息传递。每次调用块时,都会向self发送一条消息以进行某些操作。在doSomething方法中可以保留self,它不会触发retaincycle,因为这种方法没有到self的循环。希望你能理解:)


    谢谢,我知道strongSelf——我应该在示例代码中包含它,以避免混淆。不过,问题的关键是要找出从块内调用的方法是否也需要进行弱自我/强自我舞蹈。如果一个块调用methodOne,methodOne引用了
    self
    ,那么这会触发一个retain循环吗?但是,我现在发现这个问题没有真正意义,因为如果需要weakSelf,它需要在被调用的方法之外定义,并且没有实际的方法可以做到这一点。只有在块内保留self时,才会触发Retain cycle。否则它只会发出警告。
    [self class] __weak *weakSelf = self;
    self.completionBlock = ^{
        [self class] __strong *strongSelf = weakSelf
        [weakSelf doSomething];
    };
    
      - (void)doSomething
     {
           self.myProperty = 5; // Is this ok or does it need to use a weakSelf?
      }