答案來源于網(wǎng)上,非原創(chuàng),如有侵權請聯(lián)系本人
1、如果讓你實現(xiàn)屬性的weak,如何實現(xiàn)的?
答:對于注冊為weak的對象,系統(tǒng)會以weak指向的對象內(nèi)存地址作為key,將之放入到一個hash表之中,當此對象的引用計數(shù)為0時會調(diào)用dealloc,之后遍歷hash表中此key所對應的對象,將之置為nil。按照這個思路,我們可以在dealloc中手動釋放weak屬性,比如執(zhí)行一段block,可以參照 這里。
2、如果讓你來實現(xiàn)屬性的atomic,如何實現(xiàn)?
答:聲明為atomic的屬性,系統(tǒng)能保證每一個get或set操作都能順利完成。不論哪個線程調(diào)用了get或者set方法,系統(tǒng)會將這些操作串行執(zhí)行。
假設有一個 atomic 的屬性 "name",如果線程 A 調(diào)[self setName:@"A"],線程 B 調(diào)[self setName:@"B"],線程 C 調(diào)[self name],那么所有這些不同線程上的操作都將依次順序執(zhí)行——也就是說,如果一個線程正在執(zhí)行 getter/setter,其他線程就得等待。因此,屬性 name 是讀/寫安全的。
3、KVO為什么要創(chuàng)建一個子類來實現(xiàn)?
沒找到答案,我覺得應該是為了不影響用戶使用原有類,在用戶看來沒有任何不對的地方。
4、類結(jié)構體的組成,isa指針指向了什么?(這里應該將元類和根元類也說一下)
每個實例對象都包含一個isa變量,屬于Class類型,Class類型==objc_class *。這個isa的指向稱為類對象(就代表一個類,oc同樣視為對象),包含了該實例對象所屬的類的一些信息。每一個類對象又包含兩個Class類型變量,分別為isa、superclass,isa指向元類對象,superclass指向父類對象。
struct objc_class {
Class?isa; ? //指向元類對象
Class?super_class;//指向父類對象
constchar?*name;
long?version;
long?info;
long?instance_size;
struct?objc_ivar_list?*ivars;
struct?objc_method_list?**methodLists;
struct?objc_cache?*cache;
struct?objc_protocol_list?*protocols;
}
見下圖:
5、RunLoop有幾種事件源?有幾種模式?
答:Timer Source和Input Source(包括performSelector*方法簇、Port或者自定義Input Source);
1)NSDefaultRunLoopMode: 默認的運行模式,除了NSConnection對象的事件。
2) NSRunLoopCommonModes: 是一組常用的模式集合,將一個input source關聯(lián)到這個模式集合上,等于將input source關聯(lián)到這個模式集合中的所有模式上。在iOS系統(tǒng)中NSRunLoopCommonMode包含NSDefaultRunLoopMode、NSTaskDeathCheckMode、UITrackingRunLoopMode。
6、方法列表的數(shù)據(jù)結(jié)構是什么?
struct objc_method {
SEL method_name;//?方法名稱
char char*method_typesE;//?參數(shù)和返回類型的描述字串
IMP?method_imp;//?方法的具體的實現(xiàn)的指針
}