引用计数存储,weak指针原理,autorelease原理

引用计数存储  

查看runtime源码 看retain release recount实现大致过程如下

1.1.判断是否小对象

1.2.判断是否优化过的isa指针 nonpoint isa

1.3.通过hash查找对应的散列表  

1.4 找到对应引用计数值 +-1操作

散列表结构 {1.自旋锁  引用计数表 弱引用表}

 

2.weak指针原理

 // ARC是LLVM编译器和Runtime系统相互协作的一个结果

    __strong MJPerson *person1;

    __weak MJPerson *person2;

    __unsafe_unretained MJPerson *person3;

    NSLog(@"111");

    {

        MJPerson *person = [[MJPerson alloc] init];

        person1 = person;  //在打印 111 222 之后释放

        person2 = person;  //在打印 111 222 之间释放

        person3 = person;  //在打印 111 222 之间释放

    }

    NSLog(@"222 - %@", person3); person2//打印为NULL  person3会野指针崩溃

 

查看runtime源码 看dealloc

rootDealloc()

objc_dispose()

objc_destructInstance()

clearDellocation()//将指向当前对象的弱指针置为nil

 

3 AutoreleasePool  AutoreleasePage

AutoreleasePool 是一个结构体 构造函数调用push 析构函数调用pop方法

AutoreleasePage 是一个双向链表的数据结构(占用4094字节 除了存放成员变量56个字节,会存放AutoreleasePool中的对象地址值) begin end  child  parent  next指向能存放地址的位置

push 哨兵对象入栈 返回地址值  

autorelease对象地址入栈

pop  获取哨兵对象的地址值 然后从最后一个人入栈的对象地址开始release

_objc_autorelesePoolPrint

 

4.autorelease 与 Runloop的关系

runloop 进入的时候调用 AutoreleasePool push

runloop 退出和进入休眠钱会调用 AutoreleasePool pop

所以autorelease 的对象会在所在runloop即将进入休眠或者runloop退出时释放

posted @ 2021-05-28 17:43  syh-918  阅读(104)  评论(0)    收藏  举报