日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

ARC下的所有权修饰符

發(fā)布時(shí)間:2025/4/16 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARC下的所有权修饰符 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ARC有效時(shí),id類型必須加上所有權(quán)修飾符

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

所有權(quán)修飾符

__strong

  • 默認(rèn)修飾符,修飾的變量的默認(rèn)值為nil。當(dāng)需要釋放強(qiáng)引用指向的對(duì)象時(shí),需要將強(qiáng)引用置nil。
  • 持有強(qiáng)引用的變量在超出其作用域時(shí)被廢棄,同時(shí)釋放其引用的對(duì)象

__weak

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

__unsafe_unretained

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

__autoreleasing

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

二級(jí)指針與修飾符

  • 二級(jí)指針(id的指針或?qū)ο笾羔樀闹羔?#xff09;在沒(méi)有顯示指定時(shí)會(huì)被附加上__autoreleasing修飾符

    • NSError *error等價(jià)于NSError * __strong error
    • NSError ** error等價(jià)于NSError * __autoreleasing *error
    • 實(shí)際上,現(xiàn)在xcode中已經(jīng)不允許不帶修飾符的二級(jí)指針 
  • 給二級(jí)指針的解引用賦值時(shí),應(yīng)保證兩邊的修飾符相同

    • 錯(cuò)誤示例
      

    • 正確示例

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

二級(jí)指針與__autoreleasing

  • 當(dāng)函數(shù)形參arg為_(kāi)_autoreleasing修飾的二級(jí)指針時(shí),在函數(shù)體內(nèi)對(duì)*arg賦值,最終*arg引用的是已注冊(cè)到autoreleasepool的對(duì)象
void getErr:(NSError * __autoreleasing *)error {*error = [[NSError alloc] initWithDomain:aDomain code:NSURLErrorBadURL userInfo:nil]; }

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

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。