2014-02-20 72 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

它不會。因爲它只是指向一個不會引用像對象一樣的方法內部的方法。

相關問題