日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARC下的所有权修饰符

發布時間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARC下的所有权修饰符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ARC有效時,id類型必須加上所有權修飾符

  • 下面為三種等效的聲明,為了便于和二級指針的情況聯系起來,采用第一種。
NSError * __weak error = nil;NSError __weak *error = nil;__weak NSError *error = @"hehe";

所有權修飾符

__strong

  • 默認修飾符,修飾的變量的默認值為nil。當需要釋放強引用指向的對象時,需要將強引用置nil。
  • 持有強引用的變量在超出其作用域時被廢棄,同時釋放其引用的對象

__weak

  • 弱引用不增加對象的引用計數,不能持有對象實例
    • 下列程序會引起編譯警告。更好的做法是將強引用賦給弱引用
id __weak = [[NSObject alloc] init];
  • 對象在被dealloc時,指向它的弱引用會自動被置nil(zeroing weak pointer),防止野指針產生
  • 弱引用一般用于處理retain cycle,如在delegate關系中防止循環引用或者用來修飾指向由Interface Builder編輯生成的UI控件

__unsafe_unretained

  • __unsafe_unretained修飾的變量不屬于編譯器的內存管理對象,可理解為MRC時代的assign
  • 不增加所引用對象的引用計數值,但是不保證指針指向的可訪問性(類似于C++的普通指針,存在野指針情況)

__autoreleasing

  • ARC有效時,使用@autoreleasepool塊代替NSAutorelesePool類,用附有__autoreleasing修飾的變量替代autorelease方法
  • 主要用在參數傳遞返回值(out-parameters)和引用傳遞參數(pass-by-reference)的情況下。
  • 此類對象在創建出來后,被注冊到autoreleasing pool中
  • __autoreleasing修飾的變量要為自動變量(局部變量,函數以及方法參數)

二級指針與修飾符

  • 二級指針(id的指針或對象指針的指針)在沒有顯示指定時會被附加上__autoreleasing修飾符

    • NSError *error等價于NSError * __strong error
    • NSError ** error等價于NSError * __autoreleasing *error
    • 實際上,現在xcode中已經不允許不帶修飾符的二級指針 
  • 給二級指針的解引用賦值時,應保證兩邊的修飾符相同

    • 錯誤示例
      

    • 正確示例

NSError* __autoreleasing error = nil;NSError* __autoreleasing *p_error = &error;
  • 在調用形參為二級指針的方法時,如果用戶傳入實參的所有權修飾符不符,編譯器會轉換源代碼
    • 原代碼
- (void)getError:(NSError* __autoreleasing *)error {error = nil; } - (void)callGetError {NSError *error = nil;[self getError:&error]; }
  • 轉換后的callGetError
- (void)callGetError {NSError *error = nil;NSError* __autoreleasing tmp = error;[self getError:&tmp];error = tmp; }

二級指針與__autoreleasing

  • 當函數形參arg為__autoreleasing修飾的二級指針時,在函數體內對*arg賦值,最終*arg引用的是已注冊到autoreleasepool的對象
void getErr:(NSError * __autoreleasing *)error {*error = [[NSError alloc] initWithDomain:aDomain code:NSURLErrorBadURL userInfo:nil]; }

轉載于:https://www.cnblogs.com/rainySue/p/ARC-xia-de-suo-you-quan-xiu-shi-fu.html

總結

以上是生活随笔為你收集整理的ARC下的所有权修饰符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。