2012-07-20 159 views
1

這是關於使用__block釋放塊內的對象;塊內釋放對象

NSString *str = [SomeObject methodName]; // returned object is autoreleased 
[str retain]; //retaining the object since its auto released 

現在我將在塊內使用此str對象。內部塊我會釋放這個對象。 我是否需要像__block NSString *str = ..這樣的前綴,因爲iam在塊內釋放它? 從規則我明白,如果我們想修改塊內的對象,我們需要前綴__block。但是這個規則適用於釋放嗎?

+0

你不應該保留塊之外的東西,並在塊內釋放它們。 Cocoa中的內存管理是本地的。每個範圍只對自己負責。該塊的身體沒有保留它,所以不應該釋放它。另外,不能保證塊將被運行(在這種情況下,如果它負責釋放,會發生泄漏),或者可能運行多次(在這種情況下,它將被過度釋放)。 – newacct 2012-07-20 17:43:17

回答

3

編號__block需要變量要修改。釋放對象並不意味着修改變量。相反,這意味着發送一個release消息到有問題的對象。與其他任何消息一樣,沒有理由不能將release發送到塊內的對象實例,即使沒有__block限定符。

您應該知道,對於非__block限定對象變量,該塊將保留該對象。因此,雖然塊內部明確的release可能會在調用塊之前在外部/之間平衡retain,但直到塊本身被釋放後,即使沒有其他對象保留它,對象也不會實際被釋放(至少)。

+0

感謝您的澄清。即使你不修改塊內的對象,是否有使用__block限定符的副作用? – sach 2012-07-20 04:08:45

+0

我剛剛編輯了我的答案(在評論之前您可能沒有看到)提及__block將導致塊本身不保留有問題的對象。有一個非常好的帖子,包括這裏的信息:http://www.mikeash.com/pyblog/friday-qa-2009-08-14-practical-blocks.html – 2012-07-20 04:11:02