【问题标题】:Do methods called from within a block need to use weakSelf?从块内调用的方法是否需要使用weakSelf?
【发布时间】:2015-02-21 21:11:39
【问题描述】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      仅当您将 self 保留在块内时才会触发保留循环。否则它只会抛出一个警告。

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 谢谢,我知道strongSelf——我应该将它包含在我的示例代码中以避免混淆。不过,问题的重点是找出从块中调用的方法是否也需要进行weakSelf/strongSelf 舞蹈。如果一个block调用了methodOne,而methodOne引用了self,那会触发retain循环吗?
        • 但是,我现在看到这个问题并没有真正的意义,因为如果需要 weakSelf,则需要在被调用方法之外定义它并且没有实用的方法。
        • 只有当你在块内保留 self 时才会触发保留循环。否则它只会抛出一个警告。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多