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下的所有权修饰符相关推荐

  1. iOS 与OS X多线程和内存管理 笔记 ARC与所有权修饰符

    注:本文为笔记形式,所以很多都是摘抄的.<<iOS 与OS X多线程和内存管理>>书中写的很棒,简单易懂,建议各位看官自己去看看. ####ARC和MRC 前一篇主要是MRC环 ...

  2. [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)

    简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...

  3. python修饰符的理解_python函数修饰符@的使用方法解析

    这篇文章主要介绍了python函数修饰符@的使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python函数修饰符@的作用是为现有函数增 ...

  4. scala 访问修饰符_Scala访问修饰符–私有,受保护的和公共的

    scala 访问修饰符 The restriction of scope to certain places is realized with the help of access modifiers ...

  5. 访问修饰符的真正理解

    首先,必须明确Java中类成员的访问修饰符(public.private.protect.默认或friendly等,C++也同理),并不能简单的理解为书上说的如"子类可以访问",具 ...

  6. 正则表达式-y修饰符

    y修饰符 y修饰符和g修饰符是类似的,都是全局匹配,但y修饰符有一定的匹配要求 g修饰符 只要剩余的字符中存在匹配即可 y修饰符 必须从剩余字符的第一个位置开始匹配,否则退出匹配 示例讲解 let s ...

  7. 表单下拉框、表单修饰符(.lazy、.number、.trim)

    表单下拉框 知识点 v-model select 表单下拉框绑定 <div id="myApp"><h3>你最喜欢的NBA球星是:</h3>&l ...

  8. day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上/下造型,main方法,抽象类,接口,设计模式,异常,内部类

    1 Day06–面向对象1 1.1 面向对象 1.1.1 概念 推荐看的书:Thinking in java 概念:所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的 ...

  9. 访问修饰符、常见的包以及包的权限和包的导入(inport关键字)、继承(super关键字)、多态(向上和向下转型)

    IDEA中快捷生成getter/setter的快捷键为 alt+inser(enter) getter/setter命名规范:都是以gte/set单词开头+要操作的属性名称 一.访问修饰符 Java中 ...

最新文章

  1. ERROR: Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46
  2. Kubernetes 集群无损升级实践
  3. SSL/TLS抓包出现提示Ignored Unknown Record
  4. 360度无死角、近距离看「CNN」训练,是种什么体验?网友:美得不真实
  5. PIE SDK Geometry的坐标转换
  6. Ubuntu 安装OpenCV3.0.0
  7. uva111346Probability
  8. linux hibernate suspend 区别,实现Linux休眠(sleep/hibernate)和挂起(suspend)
  9. android简单点餐系统_微信点餐和扫码点餐系统能为商家带来什么?
  10. Linux实训vim编辑器的应用,Linux实训例题(vim编辑器)
  11. POJ1338 Ugly Numbers(解法二)【废除!!!】
  12. 如何使用kali的Searchsploit查找软件漏洞
  13. 常用的18个免费论文文献网站,分享给大家
  14. linux的交换空间是什么意思,Linux交换空间是什么
  15. 上传视频到FTP服务器+播放
  16. miui12系统小米系统安卓系统里面存储空间占用太多如何清理
  17. 微信小程序自定义tabBar使用
  18. 【CTSC2010】珠宝商(SAM)(点分治)(根号分治)
  19. 数据库之SQL的主键和外键的作用
  20. 如何全链路进行前端性能优化

热门文章

  1. matlab常用代码总结
  2. mysql5.5多实例配置_mysql-5.5.32多实例配置
  3. ppt讲解中的过渡_PPT教程:缩放定位功能详解
  4. php error 2,一起搞懂PHP的错误和异常(二)
  5. Spark详解(十二):Spark Streaming原理和实现
  6. asyncdata连接php,如何使用Nuxt和asyncData观察路由更改
  7. mysql连接查询作业答案_MySQL连表查询练习题
  8. java中四种常用的引用类型_java中四种引用类型
  9. 三种方法实现Linux系统调用方法分享
  10. Ubuntu 升级npm 以及安装cross-env 过程中遇到的问题