2012-07-17 90 views
3

我必須修復一些現有的代碼,這些代碼在LLVM(iOS)上構建得很好,因此它也使用llvm-gcc-4.2進行構建。我有幾乎一切完成後,除了這種模式,其在幾個地方發現:我懷疑這裏的目的是允許從一個塊中獲得的財產不保留self屬性聲明中的__block屬性

@property (nonatomic, retain) __block id myProperty; 

。我如何刪除__block屬性,哪個gcc在這裏不支持,但仍然達到相同的效果?

+0

我很肯定你不需要'__block'屬性......這是爲堆棧分配的本地人。無論如何,只需嘗試一下。如果沒有錯誤,你很好。 – nielsbot 2012-07-17 04:16:41

+0

來自Clang語言規範:「除了新的Block類型外,我們還引入了一個新的存儲限定符__block,**用於局部變量**」cf. http://opensource.apple.com/source/clang/clang-137/src/tools/clang/docs/BlockLanguageSpec.txt – nielsbot 2012-07-17 04:18:43

回答

12

我會建議你找到一個編譯器缺陷,報關:

@property (nonatomic, retain) __block id myProperty; 

是沒有意義的。 __block限定符用於本地(堆棧分配)變量,因此它們通過引用傳遞給塊,因此它們可以更新,並且通常[*]存儲在堆而不是堆棧中。

因此,限定符__block對涉及對象實例的屬性聲明沒有意義,該對象實例始終在Obj-C中分配堆。

只需從屬性聲明中刪除__block - 對於每個編譯器。

[*]如果塊從不復制到堆,編譯器可能會優化__block變量,而不會將這些變量移到堆中。

3

就在您使用塊中的變量之前,創建一個類型爲__block的本地指針。千萬不要在@property聲明中使用__block

EG:TypeOfVariable __block *bock_pointer = self.property;

^{ inside the block use bock_pointer }

+0

是的,這是我最初的想法,但我想知道是否有另一種方式來做到這一點而不觸及訪問該屬性的代碼(通過另一個屬性屬性或gcc特定的'__attribute __()'也許?)... – user1530597 2012-07-17 04:32:58

+1

爲什麼不在塊中使用'self.property'? – skywinder 2014-06-05 13:30:06

+0

爲什麼你不應該在一個街區使用房產?請解釋或提供參考 – keisar 2014-06-23 17:02:10