2011-12-20 73 views
1

我有一個屬性類,它是對塊的弱引用。捕獲「自我」時,弱保留塊如何導致保留週期

@interface BlockTest : NSObject 
    @property (nonatomic, weak) void(^testBlock)(); 
@end 

在我使用這個塊這樣的類另一點:

- (void)foobar { 
    self.testBlock = ^{ 
     [self doSomething]; 
    }; 
} 

編譯器(蘋果LLVM 3.0)抱怨說,有可能是一個保留週期,因爲self強烈這裏拍攝的。但我沒有看到這是如何導致保留週期,因爲塊本身是一個__weak參考,所以它應該沒問題。如果我正確理解ARC弱引用,那麼當-foobar方法返回傳遞給self.testBlock的塊時,應該解除分配(如果不在其他地方),因此也會釋放self

編譯器仍然認爲可能存在保留週期的原因是什麼?

+0

你的設置幾乎沒用。在函數退出後,塊將立即解除分配,因爲沒有強引用。該物業將'無'。 – newacct 2013-04-04 22:28:07

+0

這不是普遍的事實。全局和堆棧塊將不會保留或釋放,因此在分配後仍然有效(對於堆棧塊直到當前範圍結束)。這也只是一個例子。這個想法並不是阻止任何東西。 IIRC當我問這個問題時,我正在尋找一種方法來捕獲'self'方法的回調塊中的'self',而不會觸發警告。 – Alfonso 2013-04-05 22:26:59

回答

8

塊強烈捕獲其中的對象,無論塊如何引用。保留週期警告就是這種可能性的警告。如果您知道基於您的應用的上下文,此使用不會導致保留週期,您可以放心地忽略它。爲了擺脫的警告,您可以通過中介,強弱通過自我如下:

__weak typeof(self) weakSelf = self; 
self.testBlock = ^{ 
    [weakSelf doSomething]; 
}; 

我會改變你的塊屬性是很強的參考和做以上。

+0

好的,我希望我可以避免這種情況,但是看起來這是一條路。謝謝! – Alfonso 2011-12-20 15:53:47