最近在找工作嵌溢,發(fā)現(xiàn)凿歼,以前有些沒注意到的東西被問到了,好尷尬,于是今天總結(jié)一下吧绒疗,以后回顧起來方便。
1慷丽、objc中向一個對象發(fā)送消息<code>[obj foo];</code>和<code>objc_msgSend()</code>大概會像這樣:
((void (*)( id , SEL)) ;
((void)objc_msgSend);
((id)obj,sel_registerName("foo"));
也就是說<code>[obj foo];</code>在OC的動態(tài)編譯時涉枫,會被轉(zhuǎn)換成<code>objc_msgSend(obj,@selecteor(foo));</code>這樣的形式,但是需要根據(jù)具體的參數(shù)類型進(jìn)行相應(yīng)的類型轉(zhuǎn)換狡赐。
2窑业、結(jié)構(gòu)體中能定義OC對象嗎?
答:不能枕屉,因?yàn)榻Y(jié)構(gòu)體中常柄,只能是類型的聲明,不能進(jìn)行分配空間搀擂。
3西潘、蘋果是如何實(shí)現(xiàn)<code>autoreleasepool</code>的?
答:<code>autoreleasepool</code>以一個隊(duì)列數(shù)組的形式實(shí)現(xiàn)哨颂,主要通過下列三個函數(shù)完成:
objc_autoreleasepoolPush
objc_autoreleasepoolPop
objc_autorelease
其實(shí)喷市,看函數(shù)名就知道,對<code>autorelease</code>分別執(zhí)行<code>push</code>威恼,<code>pop</code>操作品姓,銷毀對象時寝并,執(zhí)行<code>release</code>操作。
4腹备、OC使用什么機(jī)制管理對象內(nèi)存的(或者內(nèi)存管理方式有哪些)衬潦?
答:<code>MRC(manual retain-release)</code> 手動內(nèi)存管理
<code>ARC(automatic reference counting)</code>自動引用計(jì)數(shù)
同時OC采用計(jì)數(shù)器的機(jī)制來決定對象是否釋放,每次<code>runloop</code>完成一次循環(huán)的時候植酥,都會檢查對象的<code>retainCount</code>镀岛,如果<code>retainCount</code>為0,說明該對象沒有地方繼續(xù)使用了友驮,可以釋放掉了漂羊。
5、常見的出現(xiàn)內(nèi)存循環(huán)引用的場景有哪些卸留?
答:(1)定時器(NSTimer):NSTimer 經(jīng)常會被作為某個類的成員變量走越,而NSTimer初始化時,制定self為target艾猜,容易造成循環(huán)引用(self->timer->self),另外若timer一直處于validate的狀態(tài)买喧,則其引用計(jì)數(shù)將始終大于0,因此匆赃,在不在使用定時器的時候淤毛,應(yīng)該先調(diào)用invalidate方法。
(2)Block: block在使用時都會對block內(nèi)部用到的對象進(jìn)行強(qiáng)引用(ARC)使其引用計(jì)數(shù)加1(MRC)算柳,在ARC和MRC環(huán)境下對block使用不當(dāng)都會造成循環(huán)引用問題低淡,一般表現(xiàn)為,某個類將block作為自己的屬性變量瞬项,然后該類在block的方法體里面又使用了該類本身蔗蹋,簡單的說就是self.someBlock = Type var{[self dosomething] 或者 self.other.Var = XXX;或者 _otherVar = XXX;};出現(xiàn)循環(huán)的原因是self->block->self 或者self->block->ivar(成員變量)
(3)代理,這個簡單囱淋,在聲明代理的時候用@property(nonomatic,weak)id<xxxxx>delegate;就好這里用weak不用assgin的原因是weak可以在對象被釋放后自動將指針置為nil猪杭,在OC中向nil發(fā)送消息是不會引起程序崩潰的嗎,而assgin就不同了妥衣,在對象被釋放后皂吮,容易造成野指針。
6税手、關(guān)于block