首頁>Program>source

我正在尝試完成难题。

__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 #

    您是對的.如官方文件所述:

    __autoreleasing to denote arguments that are passed by reference (id *) and are autoreleased on return.

    所有這些內容在ARC過渡指南中都有很好的解釋。

    在您的NSError示例中,宣告的意思是 __strong ,隱式:

    NSError * e = nil;
    

    將被轉換為:

    NSError * __strong error = nil;
    

    当您致電您的 save 方法:

    - ( BOOL )save: ( NSError * __autoreleasing * );
    

    然後,編譯器將不得不建立一个臨時變數,该變數在 __autoreleasing處設置。 .所以:

    NSError * error = nil;
    [ database save: &error ];
    

    將被轉換為:

    NSError * __strong error = nil;
    NSError * __autoreleasing tmpError = error;
    [ database save: &tmpError ];
    error = tmpError;
    

    您可以通過將錯誤物件宣告為 __autoreleasing来避免這種情况

  • 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似乎只在方法返迴時使用自動釋放池,並且已经自動處理了。

  • collections:Java列舉和迭代器之間的區別
  • garbage collection:是否有必要在C#中顯式删除事件處理程式