retain: isa做++操作,如果上溢出(isa指针无法再保存引用计数(大于2^19)),isa留一半,另一半拷贝到散列表。
release: isa做--操作,如果下溢出(引用计数为负数),如果有散列表有值从散列表删除一半给isa,如果没有值走析构。
Weak实现原理概括:
- 弱应用对象, 底层也是使用了哈希存储,或者叫散列存储,那么是对象的内存地址作为key, 指向该对象的所有弱应用的指针作为值
- 释放时,就是以对象的内存地址作为key,去存储弱引用对象的哈希表里, 找到所有的弱引用对象,然后设置为nil , 最后移除这个弱引用的散列表.
autorelease
- 自动释放池的主要结构体和类是:__AtAutoreleasePool、AutoreleasePoolPage
- 调用了autorelease的对象最终都是通过AutoreleasePoolPage对象来管理的
-
AutoreleasePoolPage的大小都是4096个字节
xyc.png
自动释放池是由AutoreleasePoolPage以双向链表的方式实现的
当对象调用autorelease方法是, 会将延迟释放的对象加入AutoreleasePoolPage中
调用pop方法是, 会向栈中的对象发送release消息
通过这个函数来查看自动释放池的情况
extern void _objc_autoreleasePoolPrint(void);
PS:
1、weakSelf 是为了block不持有self,避免Retain Circle循环引用。在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。
2、strongSelf的目的是因为一旦进入block执行,假设不允许self在这个执行过程中释放,就需要加入strongSelf。block执行完后这个strongSelf 会自动释放,没有不会存在循环引用问题。如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。
内存泄露:
内存泄露常见原因
1、循环引用
2、引引用
3、非OC对象,没有手动释放
内存泄漏检测方法
1、静态检测方法(手动、自动)
2、动态监测方法(instruments 第三方工具检测)
3、dealloc
网友评论