- timer displayLink會有循環(huán)引用的問題
- 解決 block+weakSelf卦洽,定制timer內(nèi)部用 NSProxy進(jìn)行轉(zhuǎn)發(fā),解決依賴
- Timer 里面有 timer 和 proxy抢蚀,timer轉(zhuǎn)發(fā)給proxy,proxy轉(zhuǎn)發(fā)給 realTarget
- timer計時器不準(zhǔn)確,使用GCD的定時器更加準(zhǔn)確
- 內(nèi)存布局從低到高為
保留區(qū) (最低)
代碼段 (編譯厚的代碼)
數(shù)據(jù)段 (字符串常量,已/未 初始化的全局變量噩峦,靜態(tài)變量)
堆 (分配空間從大到小)
棧 (分配空間從小到大)
內(nèi)核區(qū) (最高)
Tagged Pointer
64bit后抽兆,引入了此技術(shù)
未使用 NSNumber對象需要動態(tài)分配內(nèi)存识补,維護(hù)引用計數(shù)
使用后 指針內(nèi)部變?yōu)?tag+data,數(shù)據(jù)存于指針中辫红,指針不夠存儲凭涂,轉(zhuǎn)為動態(tài)分配內(nèi)存OC對象的內(nèi)存管理
- 新創(chuàng)建對象retainCount=1,計數(shù)器=0銷毀厉熟,retain,new,copy等+1导盅,release-1
- ARC下通過 編譯器特性llvm和runtime進(jìn)行內(nèi)存管理(自動生成setget,自動進(jìn)行runtime清除引用)
- 方法里有局部對象揍瑟,出了方法立即釋放嗎 (會白翻,arc下會,編譯器特性或者runtime調(diào)用release)
深淺copy,拷貝的目的是為了產(chǎn)生一個副本對象滤馍,根原對象不影響
其他對象自定義需實現(xiàn) NSCpoying協(xié)議岛琼,實現(xiàn) copyWithZone引用計數(shù)器存儲(https://blog.csdn.net/u013378438/article/details/82790332)
64bit后,引用計數(shù)器放在了優(yōu)化過的isa中巢株,超過了 19位后槐瑞,放sidetable
sideTable內(nèi)部有 (slock自旋鎖 ,refcnts引用計數(shù)表 weak_table弱引用表)weak原理
縱觀weak引用的底層實現(xiàn)阁苞,其實原理很簡單困檩。就是將所有弱引用obj的指針地址都保存在obj對應(yīng)的weak_entry_t中。當(dāng)obj要析構(gòu)時那槽,會遍歷weak_entry_t中保存的弱引用指針地址悼沿,并將弱引用指針指向nil,同時骚灸,將weak_entry_t移除出weak_table糟趾。dealloc
釋放函數(shù)依次為 (dealloc) (_objc_rootDealloc) (rootDealloc)(Objc_dispose)(objc_destructInstance)(free)
在objc_destructInstance將指針變?yōu)閚il自動釋放池
- 自動釋放池的主要底層數(shù)據(jù)結(jié)構(gòu)是 _AutoreleasePool AutoreleasePoolPage,調(diào)用了 Autorelease的對象都是用 AutoreleasePoolPage。
- 每個 AutoreleasePoolPage占4096個字節(jié)甚牲,除了內(nèi)部成員變量义郑,剩下空間用于放 Autorelease對象地址
- 內(nèi)部有 thread,parent丈钙,child雙向鏈表
- 調(diào)用push把 POOL_BOUNDARY 入棧非驮,返回內(nèi)存地址,pop時傳入 POOL_BOUNDARY著恩,
- 主線程有2個Obsever院尔,runloop Entry時 push
- runloopBeforeWaiting時 pop,push
- BeforeExit pop
(http://www.reibang.com/p/1b66c4d47cd7, )
magic:用來校驗 AutoreleasePoolPage 的結(jié)構(gòu)是否完整喉誊;
next:指向棧頂邀摆,也就是最新入棧的autorelease對象的下一個位置;
thread:指向當(dāng)前線程伍茄;
parent:指向父節(jié)點(diǎn)
child:指向子節(jié)點(diǎn)
depth:表示鏈表的深度栋盹,也就是鏈表節(jié)點(diǎn)的個數(shù)
hiwat:表示high water mark(最高水位標(biāo)記)
轉(zhuǎn)載請注明出處。