iOS runtime探究(五): 从runtime开始深入weak实现机理

你要知道的runtime都在这里

转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639341

本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向:

本文是系列文章的第五篇文章,也是系列文章的最后一篇从runtime开始: 深入weak实现机理,本文主要讲解runtime是如何实现weak修饰符的。

weak修饰符我们一点也不陌生在开发中经常用到,最主要的作用是为了防止引用循环(retained cycle),经常用于blockdelegate,在前面几篇文章中已经讲解了weak的基本使用和引用循环,如果有兴趣可以参考文章iOS @property探究(一): 基础详解iOS @property探究(二): 深入理解iOS block探究(一): 基础详解iOS block探究(二): 深入理解,相关方法和特点本文不再赘述了。

weak

weak不论是用作property修饰符还是用来修饰一个变量的声明其作用是一样的,就是不增加新对象的引用计数,被释放时也不会减少新对象的引用计数,同时在新对象被销毁时,weak修饰的属性或变量均会被设置为nil,这样可以防止野指针错误,本文要讲解的也正是这个特性,runtime如何将weak修饰的变量的对象在销毁时自动置为nil

那么runtime是如何实现在weak修饰的变量的对象在被销毁时自动置为nil的呢?一个普遍的解释是:runtime对注册的类会进行布局,对于weak修饰的对象会放入一个hash表中。用weak指向的对象内存地址作为key,当此对象的引用计数为0的时候会dealloc,假如weak指向的对象内存地址是a,那么就会以a为键在这个weak表中搜索,找到所有以a为键的weak对象,从而设置为nil

了解了以上知识后就可以深入runtiem代码来看看具体实现细节,有兴趣的读者可以继续阅读。

深入runtime理解weak

备注

由于作者水平有限,难免出现纰漏,如有问题还请不吝赐教。

时间: 2024-12-05 04:30:30

iOS runtime探究(五): 从runtime开始深入weak实现机理的相关文章

iOS runtime探究(二): 从runtime開始深入理解OC消息转发机制

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639289 本文主要解说runtime相关知识,从原理到实践.由于包括内容过多分为下面五篇文章详细解说.可自行选择须要了解的方向: 从runtime開始: 理解面向对象的类到面向过程的结构体 从runtime開始: 深入理解OC消息转发机制 从runtime開始: 理解OC的属性property 从runtime開始: 实践Category加入属

iOS runtime探究(三): 从runtime开始理解OC的属性property

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639303 本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制 从runtime开始: 理解OC的属性property 从runtime开始: 实践Category添加属

iOS runtime探究(一): 从runtime开始理解面向对象的类到面向过程的结构体

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639205 本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制 从runtime开始: 理解OC的属性property 从runtime开始: 实践Category添加属

iOS runtime探究(四): 从runtiem开始实践Category添加属性与黑魔法method swizzling

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639335 本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制 从runtime开始: 理解OC的属性property 从runtime开始: 实践Category添加属

iOS内存分配五大区:

iOS内存分配五大区: 栈区,堆区,静态区(全局区),常量区,代码区 动态数据区一般就是”堆栈”,栈是线性结构,堆是链式结构. 本地变量在堆栈中.通过堆栈的基地址和偏移量来访问本地变量 动态内存分配有系统根据程序需要即时分配,且分配的大小就是程序要求的大小. 全局变量(一般用static修饰的变量)和静态变量分配在静态区(需要预先分配存储空间) 静态内存分配:分配固定大小的内存分配方法,大多情况下会浪费大量的内存空间,少数情况下,当定义的数组不够大时,会引起越界. 局部变量采用栈的方式存放

斯坦福IOS开发第五课(第一部分)

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/27706991 作者:小马 由于第五课的内容比较多,分两部分来写. 一 屏幕旋转基本操作 控制当前的view是否支持旋转,如果是,是支持哪些方向的,有四个方向,分别是home键在下,上,左右. 在当前的viewcontroller里,实现shouldAutorotateToInterfaceOrientation方法,告诉系统你支持的旋转方向,如下: - (BOOL)shouldA

斯坦福IOS开发第五课(第二部分)

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/27845257 作者:小马 五 代码示例 上面讲到的知识点在这个示例都有涉及.另外我这里也只是分析部分重要的代码,更多的知识了解请自行下载代码(文章最下面有地址)并结合公开课一起看. 新建一个single view的工程,然后新增一个视图类,叫FaceView,如下图所示: 然后我们在storyboard里拖进来一个通用的视图控件,作为上面那个视图类对应的视图,如下图所示:    

重写成员“log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)”时违反了继承安全性规则

在.NET 4.0下使用最新版本的log4Net 1.2.10,会遇到下面这样的错误: 重写成员“log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)”时违反了继承安全性规则.重写方法的安全可访问性必须与所重写方法的安全可访问性 匹配. 说明: 执行当

iOS 基础 第五天(0809)

0809 - 内存管理,只对oc对象生效. alloc.retain.release.retainCount 局部变量是放在栈里面的,oc对象是放在堆里面的.栈里面的内容系统自动回收,而堆里面的内容还在,所以不适用ARC的时候要手动回收这些对象内容 如下图所示: 对象的基本结构 每一个对象内部都有一个引用计数器,占用4个字节,是一个整数,当这个引用计数器的值为0的时候,这个对象就会被系统回收销毁.当一个对象刚刚诞生的时候,这个计数器的值为1 如下图所示: 引用计数器的作用 如下图所示: 引用计数