我正在尝試完成难题。
__strong
是所有Objective-C可保留物件指標(如NSObject,NSString等)的預設值。這是一个強大的參考. ARC与
-release
保持平衡
在範圍的末尾。
__unsafe_unretained
等於旧方法.它用於弱指標而不保留可保留物件。
__weak
就像
__unsafe_unretained
除了它是一个自動归零的弱引用,這意味着一旦釋放引用的物件,指標將被設置為nil.這樣就消除了悬掛指標和EXC_BAD_ACCESS錯誤的危险。
但是
__autoreleasing
到底是什麼
有好處吗? 我很难找到有關何時需要使用此限定符的實際示例.我相信這仅適用於期望指標指向的函式和方法,例如:
- (BOOL)save:(NSError**);
或
NSError *error = nil;
[database save:&error];
在ARC下必须這樣宣告:
- (BOOL)save:(NSError* __autoreleasing *);
但這太模糊了,我想充分理解為什麼。.我發現的代碼片段將__autoreleasing放置在两颗星之間,這對我来說很奇怪.型別是
NSError**
(指向NSError的指標),為什麼要放置
__autoreleasing
在星星之間,而不仅仅是在
NSError**
前面
?
此外,在其他情况下,我必须依靠
__autoreleasing
- 5月前1 #
- 5月前2 #
在評論中紧隨Macmade的迴答和Proud Member的後續問题,(也会將其發佈為評論,但超過了最大字元數):
這就是為什麼__autoreleasing的變數限定詞放在两颗星之間的原因。
首先,用限定符宣告物件指標的正確語法是:
NSError * __qualifier someError;
編譯器会原谅這一點:
__qualifier NSError *someError;
但這是不正確的.請參阅Apple ARC過渡指南(阅讀以"您應该正確修飾變數..."開頭的部分)。
解決当前的問题:双指標不能具有ARC記憶體管理限定符,因為指向記憶體地址的指標是指向原始型別的指標,而不是指向物件的指標.但是,在宣告双指標時,ARC確實想知道第二个指標的記憶體管理規則.這就是為什麼將双指標變數指定為:
SomeClass * __qualifier *someVariable;
因此,如果方法引數是双NSError指標,則資料型別宣告為:
- (BOOL)save:(NSError* __autoreleasing *)errorPointer;
用英語說"指向__autoreleasing NSError物件指標的指標"。
- 5月前3 #
權威的ARC規範說
For __autoreleasing objects, the new pointer is retained, autoreleased, and stored into the lvalue using primitive semantics.
例如,代碼
NSError* __autoreleasing error = someError;
實際上已轉換為
NSError* error = [[someError retain] autorelease];
...這就是為什麼当您有引數
NSError* __autoreleasing * errorPointer
時它可以工作的原因 ,則呼叫的方法会將錯誤分配给*errorPointer
並且上面的語義將会開始。您可以使用
__autoreleasing
在不同的上下文中將ARC物件強製进入自動釋放池,但這並不是非常有用,因為ARC似乎只在方法返迴時使用自動釋放池,並且已经自動處理了。
相似問題
- iphone:如何在iOS的MKAnnotation中添加更多详细資訊iphoneobjectiveciosmkannotation2021-01-12 01:29
- objective c:iOS:一般从NSObject類序列化/反序列化複雜的JSONiosobjectivecjsongenericsjsonkit2021-01-10 17:56
- 如何使用目標C在iOS本地下載和儲存檔案?objectiveciosdownloadwgetlocalstorage2021-01-09 21:27
- iphone:iOS應用程式Display Recorder如何在不使用私有API的情况下記錄螢幕?iphoneobjectivecios2021-01-09 22:31
- ios:設置UILabel行距iosobjectivecuilabelmultilinelinespacing2021-01-10 00:29
您是對的.如官方文件所述:
所有這些內容在ARC過渡指南中都有很好的解釋。
在您的NSError示例中,宣告的意思是
__strong
,隱式:將被轉換為:
当您致電您的
save
方法:然後,編譯器將不得不建立一个臨時變數,该變數在
__autoreleasing
處設置。 .所以:將被轉換為:
您可以通過將錯誤物件宣告為
__autoreleasing
来避免這種情况