iOS 内存管理

2021-10-07  本文已影响0人  All_Be_Alright

内存管理

1、内存布局

内存布局

2、内存管理方案

3、NONPOINTER_ISA

0-31 32-63 位图

4、散列表

散列表 SideTable hash查找 size_t weak_table_t 问题

答案:引入一个分离锁,每8个表用一个锁,可以解决多线程访问问题,并且类类似于操作系统中,多页表的设计,可用对象指针查找在哪张表上,再具体查找,这样也可以提高查找效率。

答案 如何快速分流

5、MRC

红色的关键字,MRC的特有方法,在ARC下调用会报错。

MRC

6、ARC

ARC

7、引用计数

retain release retainCount dealloc

object_dispose( )

object_dispose

objc_destructInstance( )

objc_destructInstance

clearDeallocating( )

clearDeallocating

8、弱引用管理

弱引用管理 objc_initWeak 添加weak

weak_register_no_lock函数中做了一个弱引用添加,具体添加的位置,是通过hash算法查找的,如果当前位置,已经有了对象所对应的弱引用数组,就把新的弱引用指针添加到数组中,如果没有,会重新创建一个弱引用数组,把第0个位置,添加弱引用指针。

weak_register_no_lock()中调用了weak_entry_for_referent()方法,查找弱引用数组,如果存在就添加如引用,如果不存在就创建一个

weak_entry_for_referent 清除weak weak_clear_no_lock

查找到弱引用数组后,用for循环置为nil。

9、自动释放池

自动释放池 push pop AutoreleasePoolPage AutoreleasePoolPage AutoreleasePoolPage::push [obj autorelease] 入栈 开始 结束

10、循环引用

自循环引用 相互循环引用 多循环引用

1、代理

2、 Block 重点

3、NSTimer 重点

4、大环引用

11、NSTimer的循环引用问题

一个控制器里面有一个Banner轮播图控件对象,轮播图控件对象里面有一个NSTimer,每1秒调用一次,NSTimer在创建的时候会对它的Target进行一个强引用,就产生了一个循环引用

NSTimer的循环引用

答案:

答案

代码:

给NSTimer创建一个分类

代码
上一篇下一篇

猜你喜欢

热点阅读