ARC下的所有权修饰符
生活随笔
收集整理的這篇文章主要介紹了
ARC下的所有权修饰符
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ARC有效時(shí),id類型必須加上所有權(quán)修飾符
- 下面為三種等效的聲明,為了便于和二級(jí)指針的情況聯(lián)系起來(lái),采用第一種。
所有權(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)引用賦給弱引用
- 對(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ò)誤示例
正確示例
- 在調(diào)用形參為二級(jí)指針的方法時(shí),如果用戶傳入實(shí)參的所有權(quán)修飾符不符,編譯器會(huì)轉(zhuǎn)換源代碼
- 原代碼
- 轉(zhuǎn)換后的callGetError
二級(jí)指針與__autoreleasing
- 當(dāng)函數(shù)形參arg為_(kāi)_autoreleasing修飾的二級(jí)指針時(shí),在函數(shù)體內(nèi)對(duì)*arg賦值,最終*arg引用的是已注冊(cè)到autoreleasepool的對(duì)象
轉(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)題。
- 上一篇: 拒绝了对对象 'XXX' (数据库 'X
- 下一篇: vmware虚拟机移植带来的问题