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虚拟机移植带来的问题