71.GCD內部怎么實現的?
①.iOS和 OSX 的核心是 XNU 內核, GCD是基于 XNU 內核實現的(是由蘋果電腦發展起來的操作系統內核).②.GCD 的 API 全部在 libdispatch 庫中.③.GCD 底層實現主要有 Dispatch Queue(管理 block)和 Dispatch Source(處理事件).?
72.怎么保證多人開發進行內存泄露檢查。使用Analuze進行代碼的靜態分析,為避免麻煩,多人開發盡量使用ARC.
73、非自動內存管理情況下怎么做單例模式。創建一個單例對象的靜態實例,并初始化為nil。創建一個類的類工廠方法,當且僅當這個類的實例為nil時生成一個類的實例。實現NScopying協議,覆蓋allocWithZone:方法,確保用戶在直接分配對象時,不會產生另一個對象。覆蓋release、autorelease、retain、retainCount方法,確保單例的狀態。
?74、對于類方法(靜態方法)默認是autorelease的,所有類方法都會這樣嗎?①、系統自帶的絕大數類方法返回的對象,都是經過autorelease.?
75、block在ARC中和MRC中的方法有何區別?需要注意什么?①.對于沒有引用外部變量的Block,無論在ARC還是MRC下,類型都是_NSGlobalBlock_,這種類型的block可以理解為一種全局的block,不需要考慮作用域的問題。同時,對它進行Copy和Retain操作也是無效的。②.避免循環引用。根據isa指針,block一共有3種類型的block_NSConcreteGlobalBlock 全局靜態_NSConcreteStackBlock 保存在棧中,出函數作用域就銷毀_NSConcreteMallocBlock 保存在堆中,retainCount == 0銷毀?
76.什么情況下會發生內存泄露和內存溢出?當程序在申請內存后,無法釋放已經申請的內存空間(例如一個對象或者變量在用完后沒有釋放,這個對象就一直占用著內存),一次內存泄露可以忽略,但如果泄露過多的話,就會造成內存溢出。當程序在申請內存時,但存入了更大的數據,出現內存溢出。?
77.[NSArray arrayWithobject]這個方法添加對象后,需要對這個數組進行釋放操作嗎?
不需要,這個對象會被放到自動釋放池中。
78.自動釋放池如何實現?
自動釋放池以棧的形式實現,當你創建一個新的自動釋放池時,它將被添加到棧頂,當一個對象收到發送autorelease消息時,它將添加到當前線程的處于棧頂的自動釋放池中,當自動釋放池被回收時,它們從棧中被刪除并且會給池子里所有對象都做一次release操作。
79.KVO內部實現原理?
①.KVO是基于runtime機制實現的。
②.當某個類的對象第一次被觀察時,系統就會在運行期動態的創建該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter方法。
派生類在被重寫setter方法中實現了真正的通知機制。(Person->NSKVONotification Person)
80.能否把比較耗時的操作放在NSNotificationCenter中。
如果在異步線程發出的通知,那么就可以把耗時操作放到NSNotificationCenter中
如果在主線程發的通知,那么就不可以把耗時操作放到NSNotificationCenter中。