概述

这里假设你已经熟悉__strong和__weak,如果不懂就不用继续往下看了。

__unsafe_unretained:和__weak 一样,唯一的区别便是,对象即使被销毁,指针也不会自动置空, 此时指针指向的是一个无用的野地址。如果使用此指针,程序会抛出 BAD_ACCESS 的异常。

举例分析:

下面我们通过两个简单的例子来分析一下,以下如果未特别说明,都是在ARC环境下:

我们先来看第一个例子:

    id __unsafe_unretained obj = [[NSMutableArray alloc]init];[obj addObject:@"obj"];

这里先不管编译器的警告,继续执行,在第二条语句就会崩溃,分析:

附有__unsafe_unretained修饰符的变量同附有__weak修饰符的变量一样,因为自己生成并持有的对象不能继续为自己持有,所以生成的对象会立即被释放。也就是说在执行完init方法以后,obj指针所指向的内存就已经释放掉了,可是obj指针并没有像附加__weak的指针那样,将指针自动置为nil,它依然指向原来的地址,可是这块地址的内存已经被系统回收了,再访问就是非法的,也就是野指针,再执行后面的addObject方法自然会出错了。

也就是说上面的代码,把__unsafe_unretained换成__weak就不会崩溃,因为obj会自动制置为nil。对nil发送消息是不会有问题的。

这里我们再通过一个例子分析一下:

    id __unsafe_unretained obj1 = nil;{id  obj0 = [[NSMutableArray alloc]init];[obj0 addObject:@"obj"];obj1 = obj0;NSLog(@"obj0 = %@", obj0);}NSLog(@"obj1 = %@", obj1);

依然在最后的NSLog语句崩溃。分析:

因为__unsafe_unretained既不强引用,也不弱引用,作用域外obj0强引用失效,并且没有其他指针强引用这个对象,所以自动释放持有的对象,obj1就相当于野指针,访问野指针就会崩溃;

也就是说,赋值给附有__unsafe_unretained修饰符变量的对象在通过该变量使用时,如果没有确保其确实存在,那么应用程序就会崩溃;

理解__unsafe_unretained相关推荐

  1. block的理解 ios_深入理解iOS的block (下)

    对象类型的auto变量 例子一 首先看一个简单的例子 定义一个类 YZPerson,里面只有一个dealloc方法 @interface YZPerson : NSObject @property ( ...

  2. Block源码解析和深入理解

    Block源码解析和深入理解 Block的本质 Block是"带有自动变量值的匿名函数". 我们通过Clang(LLVM编译器)来将OC的代码转换成C++源码的形式,通过如下命令: ...

  3. ios runtime重要性_iOS:学习runtime的理解和心得

    作者:兴宇是谁 授权本站转载. Runtime是想要做好iOS开发,或者说是真正的深刻的掌握OC这门语言所必需理解的东西.最近在学习Runtime,有自己的一些心得,整理如下, 一为 查阅方便 二为 ...

  4. ios runtime重要性_iOS 之runtime运行机制理解

    Runtime 是想要做好iOS 开发,或者说是真正的深刻的掌握OC这门语言所必须的理解的东西,最近在学习Runtime. 查阅方便 或许能给他人一些一些启发 什么是Runtime 我们写的代码在程序 ...

  5. 通用解题法——回溯算法(理解+练习)

    积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...

  6. stream流对象的理解及使用

    我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...

  7. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  8. java局部变量全局变量,实例变量的理解

    java局部变量全局变量,实例变量的理解 局部变量 可以理解为写在方法中的变量. public class Variable {//类变量static String name = "小明&q ...

  9. 智能文档理解:通用文档预训练模型

    预训练模型到底是什么,它是如何被应用在产品里,未来又有哪些机会和挑战? 预训练模型把迁移学习很好地用起来了,让我们感到眼前一亮.这和小孩子读书一样,一开始语文.数学.化学都学,读书.网上游戏等,在脑子 ...

最新文章

  1. sentinel 时间窗口_Sentinel使用令牌桶实现预热【原理源码】
  2. 写入缓存策略无法更改_【第1747期】webpack 5 之持久化缓存指南
  3. python将文件夹打包
  4. 解决ccSvcHst.exe CPU占用超50%的问题,及其缘由
  5. Nodejs入门[在互联网上非常经常,非常疯狂的一个转载]
  6. V 神呼吁宽大处理,以太坊开发者 Virgil Griffith 被判入狱 63 个月
  7. Deep Learning快速学习方法
  8. java 最简单一个家庭支付收入项目(实用于刚入门的小伙伴)
  9. 华为P30将在3月26日发布
  10. 计算机科学导论教程,计算机科学导论教程重点(6页)-原创力文档
  11. Java练手小游戏集结,你还在等什么
  12. Altium Designer AD 2019最新封装库下载,原理图库PCB库
  13. 深入理解HTTP一:网络基础TCP/IP
  14. N卡驱动版本与NVCUDA驱动版本和CUDA toolkit的关系
  15. vue-cli 开启js代码压缩和代码分割
  16. GNU nano介绍
  17. 广告行业eCPM概念
  18. eclipse快速创建无参和有参构造函数:
  19. 为什么说jsp被替代了_您说什么:最喜欢的Windows资源管理器替代品
  20. 昨天,我的大学学习[5]--转载自:www.cstc.net.cn

热门文章

  1. TCP/IP(一)网络基础知识
  2. iOS SnowAnimation(下雪动画)~demo
  3. 小玩意 - Chrome插件——GreenChrome(GC)失效如何解决?
  4. 非叫“秩”不可,有秩才有解
  5. 压力测试工具WCAT
  6. 桌面图标有蓝色阴影终极解决方法
  7. window正版验证的秘密
  8. Redis 事件循环函数serverCron
  9. 第十七周-day72-Python编程基础day04
  10. 6位不连续、不相同纯数字的正则表达式