【问题标题】:Does calling a method inside a block that calls another method referring to self cause a retain cycle?在调用另一个引用 self 的方法的块内调用方法是否会导致保留周期?
【发布时间】:2014-02-20 13:32:29
【问题描述】:

doFirst 可以在这里引起一个保留周期吗?

@interface Example : NSObject
@property (nonatomic, strong) void (^block)();
@end

@implementation Example

- (void)doFirst
{
    __weak id weakSelf = self;
    self.block = ^ {            
        [weakSelf doSecond];
    };

    self.block();
}

- (void)doSecond
{
    self.value = //...
    // do other stuff involving self
}
@end

【问题讨论】:

  • 当引用一个weakSelf时,一个有用的提示是做这样的事情:__weak typeof (self) weakSelf = self。在不同的地方重用代码等时让事情变得更容易

标签: ios retain-cycle


【解决方案1】:

与块不同,方法不是对象;它们不能持有对对象的永久引用。

您的代码不会导致保留周期。 doSecond 中的代码明确引用 self 的事实并不意味着 self 会保留额外的时间。当您的块调用doSecond 时,它的self 来自doFirst 内部的weakSelf 引用。

注意:当您将块存储为属性时,use (nonatomic, copy) 而不是(nonatomic, strong)

【讨论】:

  • 为什么 copystrong 在这里很重要?它由Example 类创建和拥有,而不是由另一个类提供。 AFAIK,这不会在创建块时增加额外的开销吗?
  • 不管copystrong 语义如何,这是一个明确的答案并且很有意义,尤其是关于methods are not objects。 +1。谢谢。
  • @JRG-Developer 您需要在堆栈上创建的块的副本。在您显示的代码中,这并不重要,因为您在退出定义它的方法之前调用了该块。但是,如果您希望该块保留,则需要在方法退出之前对其进行复制。
【解决方案2】:

不会。因为它只是指向方法,它不会在方法内部保存whatwhere,它只是像对象一样的引用。

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多