2011-10-01 25 views
2

當ARC來到Objective-C的,我盡力通過Objective-C Automatic Reference Counting (ARC)引導張貼鏘項目網站上閱讀以獲得更好的開竅究竟是什麼了。我發現什麼有(沒有別的地方)用__attribute__聲明,以表示電弧某些代碼是否自動釋放其返回值,例如(__attribute__((ns_returns_autoreleased))),還是「消耗」參數(__attribute((ns_consumed)),等等提。使用__attribute __的的在ARC-託管代碼

然而,似乎指南提供了必要性,這些聲明持有的實際水平非常小的字,扣除他們似乎沒有什麼區別,無論是運行時,靜態分析,也不運行項目本身的時候。做這些,甚至使不同的是,用__attribute__((objc_method_family(new)))標記方法是否有優勢?我在ARC上找到的文章根本沒有提及這些說明符;也許一位ARC大師可以提供這些用法的用詞。(就個人而言,我有以防萬一所有相關的說明符,但發現他們使代碼混淆和混亂。)

回答

3

這是沒有必要在大多數的情況下,因爲LLVM &鏘知道ObjC命名約定。因此,如果您遵循Cocoa的標準命名約定,LLVM會自動採取相應的家族/返回內存策略。

即是說,如果您聲明一個名爲initWith...的方法,它會自動將其視爲「init」系列方法,不需要指定__attribute__((objc_method_family(init))),Clang會自動檢測它;相同的new家庭等

事實上,你只需要使用__attribute__說明符時,叮噹不能猜測這種情況下,實際上很少發生(實際上我從來沒有使用它),或者只有如果你不尊重命名約定:


報價Clang Language Extensions Documentation

在Objective-C的許多方法都可以通過選擇確定的傳統含義。爲了靜態分析的目的,能夠將方法標記爲具有特定常規含義的方法有時是有用的,儘管沒有正確的選擇器或者不具有其選擇器將建議的常規含義。對於這些用例,我們提供了一個屬性來具體描述方法所屬的方法族。

所以,只要你尊重命名約定(你應該總是這樣做),你不會有任何事情做。

5

這些屬性是明確地爲異常的情況下,如:

可保持對象指針類型的函數或方法參數可以被標記爲消耗,表示被叫方期望採取1的所有權保留計數。

它返回一個可保持對象指針類型可被標記爲返回一個保留值,表示呼叫者希望採取1的所有權保留計數的函數或方法。

您通常不會做這些事情,所以您通常不會使用這些屬性。沒有屬性,正常的行爲 - NARC規則,或者在ARC下我應該說CAN - 是編譯器實現和期望的。

有使用這些屬性兩方面的原因:

  • 爲了違反CAN規則;也就是說,讓一個沒有這樣命名的方法返回一個引用,或者一個沒有這樣命名的方法。屬性記錄了方法原型中的違規情況,如果實現使用ARC,甚至可能需要實現它。
  • 使用Core Foundation類型,包括Core Graphics類型。這些不是ARCed的,因此您需要使用橋接屬性來幫助轉換爲「可保留對象指針」類型。