iOS37 -- 内存管理之weak原理

iOS37 -- 内存管理之weak原理_第1张图片
引用计数的存储原理

iOS37 -- 内存管理之weak原理_第2张图片

iOS37 -- 内存管理之weak原理_第3张图片
MJPerson *person1 默认就是__trong MJPerson person1,也就是强引用。 过了大括号以后,左边的局部变量person就不存在了,也就是person这个指针就消失了。变成了 = [[MJPerson] alloc] init。此时就没有任何强指针指向这个对象,那这个对象就会销毁了

iOS37 -- 内存管理之weak原理_第4张图片
MRC 环境下

iOS37 -- 内存管理之weak原理_第5张图片
peroson1 = person 的情况

iOS37 -- 内存管理之weak原理_第6张图片
peroson2 = person 的情况。所以person2是非强指针。一般我们说的弱指针就是这个

iOS37 -- 内存管理之weak原理_第7张图片
peroson3 = person 的情况,所以person3是非强指针

iOS37 -- 内存管理之weak原理_第8张图片
这种情况打印person3,会发生坏内存访问。此时person3是个野指针

iOS37 -- 内存管理之weak原理_第9张图片
这种访问person2的情况,不会有问题。因为weak修饰的指针,在所指的对象销毁的时候,会自动把指针致为nil

weak原理:


iOS37 -- 内存管理之weak原理_第10张图片
首先一个对象释放的时候,会自动调用dealloc方法,dealloc方法里面会调用一个c++的函数_objc_rootDealloc

iOS37 -- 内存管理之weak原理_第11张图片
_objc_rootDealloc里面会在调用obj_rootDealloc函数

iOS37 -- 内存管理之weak原理_第12张图片
这是一个c++的函数。isa.nonpointer是否是优化过后的isa指针。isa.weakly_referenced是否有弱引用。isa_has_assoc是否有关联对象。isa.has_cxx.dtor是否有c++的析构函数,也就是销毁函数。isa.has_sidedable_rc是否有另外的结构来存储引用计数。如果都没有就调用free()函数直接释放掉这个对象

iOS37 -- 内存管理之weak原理_第13张图片
如果上述条件不成立,就会来到else。调用object_dispose函数。在这个函数里面最终还是会调用free()函数来释放对象。但是在释放之前会先调用objc_destructInstance函数

iOS37 -- 内存管理之weak原理_第14张图片
在这个函数里面。如果对象有c++的析构函数,首先调用c++的销毁函数,清除成员变量。如果对象有关联对象,就移除关联的对象。并且会调用clearDeallocating函数来将指向当前对象的弱指针置为nil

iOS37 -- 内存管理之weak原理_第15张图片
clearDeallocating函数的实现

iOS37 -- 内存管理之weak原理_第16张图片
弱引用表采取的是哈希表存储的,也就是散列表存储

ARC会自动帮我们生成release,retain,autorelease代码。这是编译器做的

你可能感兴趣的:(iOS37 -- 内存管理之weak原理)