2014-02-20 39 views
5

可以doFirst在这里导致保留周期?在调用另一个引用self的方法的块内调用方法是否会导致保留周期?

@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 
+0

引用weakSelf时有用的提示是做这样的事情:'__weak typeof(self)weakSelf = self'。在不同的地方重复使用代码时使事情变得更容易等 – liamnichols

回答

5

不同于块,方法不对象;他们不能持有对象的永久引用。

您的代码不会导致保留周期。 doSecond参考文献self中的代码并不意味着self会保留额外的时间。当您的区块呼叫doSecond时,其self来自doFirst中的weakSelf参考。

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

+0

为什么'copy' vs'strong'在这里很重要?它由'Example'类创建和拥有,而不是由其他类提供。 AFAIK,不会在创建块时增加额外的开销吗? –

+0

无论'copy'与'strong'语义如何,这都是一个明确的答案,并且具有很大的意义,特别是关于'方法不是对象'。 +1。谢谢。 –

+1

@ JRG-Developer您需要在堆栈上创建块的副本。在你显示的代码中并不重要,因为你在从定义它的方法退出之前调用该块。但是,如果您希望该块留在附近,则需要在方法退出前复制该块。 – dasblinkenlight

0

它不会。因为它只是指向一个不会引用像对象一样的方法内部的方法。

相关问题