在调用另一个方法的块内部调用引用 self 的方法会导致保留循环吗?

5

doFirst会在这里导致Retain Cycle吗?

@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。这样在不同的地方重用代码时会更加容易。 - liamnichols
2个回答

5
与块不同,方法不是对象,它们不能永久地引用对象。
您的代码不会导致保留循环。在 doSecond 中显式引用 self 并不意味着 self 会被额外保留。当您的块调用 doSecond 时,其 self 来自 doFirst 中的 weakSelf 引用。
注意:当您将块存储为属性时,请使用 (nonatomic, copy) 而不是 (nonatomic, strong)

为什么在这里使用 copystrong 会有所不同呢?它是由 Example 类创建和拥有的,而不是由另一个类提供的。据我所知,这只会在创建块时增加额外的开销,对吗? - JRG-Developer
无论是copy还是strong语义,这都是一个清晰的答案,并且非常有道理,特别是关于“方法不是对象”的部分。+1。谢谢。 - JRG-Developer
1
@JRG-Developer 你需要复制在堆栈上创建的块。在您展示的代码中,这并不重要,因为您在退出定义它的方法之前调用该块。但是,如果您希望该块保留,需要在方法退出之前复制它。 - Sergey Kalinichenko

0

不会。因为它只是指向一个方法,该方法不会保存任何内部方法的位置,就像对象一样只是一个引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接