ARC下的所有权修饰符
生活随笔
收集整理的這篇文章主要介紹了
ARC下的所有权修饰符
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ARC有效時,id類型必須加上所有權修飾符
- 下面為三種等效的聲明,為了便于和二級指針的情況聯系起來,采用第一種。
所有權修飾符
__strong
- 默認修飾符,修飾的變量的默認值為nil。當需要釋放強引用指向的對象時,需要將強引用置nil。
- 持有強引用的變量在超出其作用域時被廢棄,同時釋放其引用的對象
__weak
- 弱引用不增加對象的引用計數,不能持有對象實例
- 下列程序會引起編譯警告。更好的做法是將強引用賦給弱引用
- 對象在被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中已經不允許不帶修飾符的二級指針 
給二級指針的解引用賦值時,應保證兩邊的修飾符相同
錯誤示例
正確示例
- 在調用形參為二級指針的方法時,如果用戶傳入實參的所有權修飾符不符,編譯器會轉換源代碼
- 原代碼
- 轉換后的callGetError
二級指針與__autoreleasing
- 當函數形參arg為__autoreleasing修飾的二級指針時,在函數體內對*arg賦值,最終*arg引用的是已注冊到autoreleasepool的對象
轉載于:https://www.cnblogs.com/rainySue/p/ARC-xia-de-suo-you-quan-xiu-shi-fu.html
總結
以上是生活随笔為你收集整理的ARC下的所有权修饰符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拒绝了对对象 'XXX' (数据库 'X
- 下一篇: vmware虚拟机移植带来的问题