2012-06-03 30 views
2

鑄造時左右(沒有雙關語意)澄清時,在變量聲明中使用__strong我在Transitioning to ARC Release Notes在這些線路傳來:當涉及到包含ARC屬性的正確位置時,Apple文檔意味着什麼?

您應該正確裝飾變量。當一個對象變量聲明中使用限定詞,正確的格式是:

ClassName * qualifier variableName; 

例如:

MyClass * __weak myWeakReference;  
    MyClass * __unsafe_unretained myUnsafeReference; 

其它變型不正確技術上,但由編譯「原諒」。要了解該問題,請參閱http://cdecl.org/

我懷疑這是某種蘋果公司的笑話,但我不認爲我明白了。這顯然沒有關係,但我想做對。正確「裝飾」變量聲明的重要性是什麼,cdecl.org試圖創建什麼?

編輯:爲了澄清,我想精確理解爲什麼寫

qualifier ClassName * variableName; 

是 「技術上不正確。」

回答

2

所以我想我有一個答案,但我不能確定我是否正確。隨意提供一個更好的,或評論/ upvote,如果你認爲我已經釘牢它。

CDecl是一個C程序,你可以從同一個網站下載。它存在解決諸如在this question中的問題。

C語言中的變量聲明可能非常臭名昭着,特別是當考慮到typedef時。有一個很好的介紹over at Unixwiz.net。你會發現有一個有用的介紹,讓你甚至可以閱讀char *(*(**foo [][8])())[];foo is array of array of 8 pointer to pointer to function returning pointer to array of pointer to char)這樣的怪物。

與這些規則是有效接近。考慮簡單的例子

const int * foo 

這將foo聲明爲一個指向常量int的指針。但是,

int * const foo 

將聲明foo作爲一個常量指針指向一個int。細微的區別詳細討論in this question.(本質上,在第一個例子中,你可以讓foo指向另一個常量int,但不能通過foo修改常量int;在第二個例子中,你可以修改foo指向的int,但是你可以讓foo指向內存中的任何其他位置)。

有了這些ARC屬性,使用

__strong NSString * myString 

的語法將聲明MyView的作爲一個指針指向一個「強」的UIView。這是無意義的。只有指向對象的指針可以在ARC下具有強(或弱或任何)的屬性。因此,這是一個很好的做法,編寫

NSString * __strong myString 

因爲這是符合其他C關鍵字。

我也問自己:如果你聲明強烈的對象指向弱對象的指針,比方說,一個NSString,像這樣

NSString * __weak * __strong myContrivedPointer; 

但同樣適用ARC下會發生什麼。對象指針只能包含這些關鍵字。因此,聲明一個指向「strong」的指針是無意義的。

相關問題