1. 內(nèi)存布局
image
- stack:棧區(qū)噩翠,方法調(diào)用
- heap:堆區(qū)巡球,通過(guò)alloc等分配的對(duì)象
- bss:未初始化的全局變量拱礁、靜態(tài)變量
- data:已初始化的全局變量等
- text:程序代碼段
2. 內(nèi)存管理
1. 基礎(chǔ)概念
TaggedPointer(小對(duì)象)
-
NONPOINTER_ISA
image
image -
散列表(引用計(jì)數(shù)表琢锋、弱引用表)
-
SideTables()結(jié)構(gòu)
image -
SideTable結(jié)構(gòu)
image
-
-
如何實(shí)現(xiàn)快速分流(定位SideTable)
SideTables本質(zhì)是一張Hash表
-
涉及到的數(shù)據(jù)結(jié)構(gòu)
-
自旋鎖-Soinlock_t
- 是“忙等”的鎖
- 適用于輕量訪問(wèn)
-
引用計(jì)數(shù)表-RefcountMap
image-
size_t
image
-
-
弱引用表-weak_table_t
image
-
2. MRC與ARC
-
MRC-手動(dòng)引用計(jì)數(shù)
image -
ARC-自動(dòng)引用計(jì)數(shù)
- ARC是LLVM編譯器和Runtime協(xié)作的結(jié)果
- 禁止手動(dòng)調(diào)用retain/release/retainCount/dealloc
- 新增weak、strong屬性關(guān)鍵字
-
引用計(jì)數(shù)管理
- alloc
- 實(shí)現(xiàn)
- 經(jīng)過(guò)一系列調(diào)用呢灶,最終調(diào)用c函數(shù)的calloc
- 此時(shí)并未設(shè)置引用計(jì)數(shù)為1
- 實(shí)現(xiàn)
- retain
- 實(shí)現(xiàn)
SideTable& table = SideTables()[this]; size_t& refcntStorage = table.refcnts[this]; refcntStorage += SIDE_TABLE_RC_ONE;
- 實(shí)現(xiàn)
- release
- 實(shí)現(xiàn)
SideTable& table = SideTables()[this]; RefcountMap::iterator it = table.refcnts.find(this); it->second -= SIDE_TABLE_RC_ONE;
- 實(shí)現(xiàn)
- retainCount
- 實(shí)現(xiàn)
SideTable& table = SideTables()[this]; size_t refcnt_result = 1; RefcountMap::iterator it = table.refcnts.find(this); refcnt_result += it->second >> SIDE_TABLE_RC_ONE;
- 實(shí)現(xiàn)
- dealloc
-
實(shí)現(xiàn)流程
-
object_dispose()實(shí)現(xiàn)
-
objc_destructInstance()
-
clearDeallocating()
-
-
-
-
- alloc
-
弱引用管理
-
自動(dòng)釋放池
- 以棧為節(jié)點(diǎn)通過(guò)雙向鏈表的形式組合
- 和線程一一對(duì)應(yīng)
- 多層嵌套就是多次插入哨兵對(duì)象
// array的釋放時(shí)機(jī)
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *array = [NSMutableArray array];
NSLog(@"%@", arrar);
}
在當(dāng)次runloop將要結(jié)束的時(shí)候調(diào)用AutoreleasePoolPage::pop()
-
實(shí)現(xiàn)原理
image
image
image-
AutoreleasePoolPage
image
image
image
image
image - AutoreleasePoolPage::pop
- 根據(jù)傳入的哨兵對(duì)象找到對(duì)應(yīng)位置
- 給上次push操作之后添加的對(duì)象以此發(fā)送release消息
-
回退next指針到正確位置
image
-
3. 循環(huán)引用
代理
Block
-
NSTimer
image 大環(huán)引用
-
解決
- 主動(dòng)避免
- 在合適的時(shí)機(jī)斷環(huán)
-
方案
- __weak
- __block
- MRC下吴超,__block修飾對(duì)象不會(huì)增加引用計(jì)數(shù),避免了循環(huán)引用
- ARC下鸯乃,__block修飾對(duì)象會(huì)被強(qiáng)引用鲸阻,需要手動(dòng)解環(huán)
- __unsafe_unretained
3. Block
1. 什么是Block
- 是將函數(shù)及其執(zhí)行上下文封裝起來(lái)的OC對(duì)象
2. 捕獲變量
image
打印:12
- 局部變量
- 基本數(shù)據(jù)類型
- 截獲其值
- 對(duì)象類型
- 連同所有權(quán)修飾符一起截獲
- 基本數(shù)據(jù)類型
- 靜態(tài)局部變量
- 以指針形式截獲
- 全局變量
- 不截獲
- 靜態(tài)全局變量
- 不截獲
3. __block修飾符
image
-
對(duì)變量進(jìn)行賦值
image
image -
__block修飾的變量變成了對(duì)象
image
image- __forwarding
- 不論在任何位置缨睡,都可以順利訪問(wèn)同一個(gè)__block變量
- __forwarding
-
blcok類型
- _NSConcreteGlobalBlock - 全局
-
_NSConcreteStackBlock - 棧
image
image
image - _NSConcreteMallocBlock - 堆
image
image