引用计数存储,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退出时释放
浙公网安备 33010602011771号