[objective-c] 在哪些情況下,我們需要在ARC下編寫__autoreleasing所有權限定符?



Answers

跟隨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對象指針的指針”。

Question

我正在努力完成這個難題。

__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






Links