目錄
- 一個(gè)NSObject對(duì)象占用多少內(nèi)存蹬刷?
- 對(duì)象的isa指針指向哪里?
- OC的類信息存放在哪里?
- iOS用什么方式實(shí)現(xiàn)對(duì)一個(gè)對(duì)象的KVO鳄虱?(KVO的本質(zhì)是什么?)
- KVC
- Category
- +load方法和+initialize方法
- Block
- _ _weak
1. 一個(gè)NSObject對(duì)象占用多少內(nèi)存凭峡?
系統(tǒng)分配了16個(gè)字節(jié)給NSObject對(duì)象(通過(guò)malloc_size函數(shù)獲得)拙已,但NSObject對(duì)象內(nèi)部只使用了8個(gè)字節(jié)的空間(64bit環(huán)境下,可以通過(guò)class_getInstanceSize函數(shù)獲得)摧冀。
2. 對(duì)象的isa指針指向哪里倍踪?
instance對(duì)象的isa指向class對(duì)象;
class對(duì)象的isa指向meta-class對(duì)象;
meta-class對(duì)象的isa指向基類的meta-class對(duì)象;
3. OC的類信息存放在哪里?
對(duì)象方法按价、屬性惭适、成員變量、協(xié)議信息楼镐,存放在class對(duì)象中;
類方法癞志,存放在meta-class對(duì)象中;
成員變量的具體值,存放在instance對(duì)象;
4. iOS用什么方式實(shí)現(xiàn)對(duì)一個(gè)對(duì)象的KVO框产?(KVO的本質(zhì)是什么凄杯?)
執(zhí)行addOberser時(shí) 利用RuntimeAPI動(dòng)態(tài)生成一個(gè)子類错洁,并且讓instance對(duì)象的isa指向這個(gè)全新的子類,當(dāng)修改instance對(duì)象的屬性時(shí)戒突,會(huì)調(diào)用Foundation的_NSSetXXXValueAndNotify函數(shù):
-> willChangeValueForKey:
-> 調(diào)用父類原來(lái)的setter
-> didChangeValueForKey:
-> 內(nèi)部會(huì)觸發(fā)監(jiān)聽(tīng)器(Oberser)的監(jiān)聽(tīng)方法( observeValueForKeyPath:ofObject:change:context:)
- 如何手動(dòng)觸發(fā)KVO屯碴?
手動(dòng)調(diào)用willChangeValueForKey:和didChangeValueForKey:- 直接修改成員變量會(huì)觸發(fā)KVO么?
不會(huì)觸發(fā)KVO
5. KVC
KVC的全稱是Key-Value Coding膊存,俗稱“鍵值編碼”导而,可以通過(guò)一個(gè)key來(lái)訪問(wèn)某個(gè)屬性。
常見(jiàn)的API
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;
- 通過(guò)KVC修改屬性會(huì)觸發(fā)KVO么隔崎?
會(huì)觸發(fā)KVO
6. Category
- 1.Category的底層結(jié)構(gòu)
- 2.Category的加載處理過(guò)程
- 3.如何實(shí)現(xiàn)給分類“添加成員變量”今艺?
- 4.關(guān)聯(lián)對(duì)象的原理
7. +load方法和+initialize方法
8. Block
block本質(zhì)上是封裝了函數(shù)調(diào)用以及函數(shù)調(diào)用環(huán)境的OC對(duì)象,它內(nèi)部也有個(gè)isa指針爵卒。
- 為了保證block內(nèi)部能夠正常訪問(wèn)外部的變量虚缎,block有個(gè)變量捕獲機(jī)制
- 3種block類型
- _ _block修飾符
- _ _block的內(nèi)存管理
9. _ _weak
weak 關(guān)鍵字的作用弱引用,所引用對(duì)象的計(jì)數(shù)器不會(huì)加一钓株,并在引用對(duì)象被釋放的時(shí)候自動(dòng)被設(shè)置為 nil实牡。
weak是Runtime維護(hù)了一個(gè)hash(哈希)表,用于存儲(chǔ)指向某個(gè)對(duì)象的所有weak指針轴合。weak表其實(shí)是一個(gè)hash(哈希)表创坞,Key是所指對(duì)象的地址,Value是weak指針的地址(這個(gè)地址的值是所指對(duì)象指針的地址)數(shù)組值桩。
- weak釋放為nil的過(guò)程:
1摆霉、調(diào)用objc_release
2、因?yàn)閷?duì)象的引用計(jì)數(shù)為0奔坟,所以執(zhí)行dealloc
3携栋、在dealloc中,調(diào)用了_objc_rootDealloc函數(shù)
4咳秉、在_objc_rootDealloc中婉支,調(diào)用了object_dispose函數(shù)
5、調(diào)用objc_destructInstance
6澜建、最后調(diào)用objc_clear_deallocating:1向挖、從weak表中獲取廢棄對(duì)象的地址為鍵值的記錄
2、將包含在記錄中的所有附有 weak修飾符變量的地址炕舵,賦值為nil
3何之、將weak表中該記錄刪除
4、從引用計(jì)數(shù)表中刪除廢棄對(duì)象的地址為鍵值的記錄
推薦學(xué)習(xí)資料:
Swift從入門(mén)到精通
每周一道算法題
戀上數(shù)據(jù)結(jié)構(gòu)與算法(一)
戀上數(shù)據(jù)結(jié)構(gòu)與算法(二)
如果需要跟我交流的話:
※ Github: https://github.com/wsl2ls
※ 簡(jiǎn)書(shū):http://www.reibang.com/u/e15d1f644bea