1冲粤、分類和擴展有什么區(qū)別淫茵?
分類中原則上只能增加方法爪瓜;類別是在運行時添加到類中;分類方法未實現(xiàn)匙瘪,編譯器也不會報警告铆铆;分類方法與原類中相同會優(yōu)先調(diào)用分類。
類擴展不僅可以增加方法丹喻,還可以增加實例變量薄货;類擴展是在編譯階段被添加到類中
2、Autoreleasepool所使用的數(shù)據(jù)結(jié)構(gòu)是什么碍论?
在沒有手加Autorelease Pool的情況下谅猾,Autorelease對象是在當前的runloop迭代結(jié)束時釋放的,而它能夠釋放的原因是系統(tǒng)在每個runloop迭代中都加入了自動釋放池Push和Pop
AutoreleasePool并沒有單獨的結(jié)構(gòu)鳍悠,而是由若干個AutoreleasePoolPage以雙向鏈表的形式組合而成(分別對應(yīng)結(jié)構(gòu)中的parent指針和child指針)税娜。
3、iOS 中內(nèi)省的幾個方法贼涩?class方法和objc_getClass方法有什么區(qū)別?
判斷對象類型:
-(BOOL) isKindOfClass: 判斷是否是這個類或者這個類的子類的實例
-(BOOL) isMemberOfClass: 判斷是否是這個類的實例
判斷對象or類是否有這個方法
-(BOOL) respondsToSelector: 判讀實例是否有這樣方法
+(BOOL) instancesRespondToSelector: 判斷類是否有這個方法
object_getClass:獲得的是isa的指向
self.class:當self是實例對象的時候巧涧,返回的是類對象,否則則返回自身遥倦。
類方法class,返回的是self占锯,所以當查找meta class時袒哥,需要對類對象調(diào)用object_getClass方法
4、鏈表和數(shù)組的區(qū)別是什么消略?插入和查詢的時間復(fù)雜度分別是多少堡称?
1、從邏輯結(jié)構(gòu)角度來看:
數(shù)組必須事先定義固定的長度(元素個數(shù))艺演,不能適應(yīng)數(shù)據(jù)動態(tài)地增減的情況却紧。當數(shù)據(jù)增加時桐臊,可能超出原先定義的元素個數(shù);當數(shù)據(jù)減少時晓殊,造成內(nèi)存浪費断凶。
鏈表動態(tài)地進行存儲分配,可以適應(yīng)數(shù)據(jù)動態(tài)地增減的情況巫俺,且可以方便地插入认烁、刪除數(shù)據(jù)項。(數(shù)組中插入介汹、刪除數(shù)據(jù)項時却嗡,需要移動其它數(shù)據(jù)項)
2、數(shù)組元素在棧區(qū)嘹承,鏈表元素在堆區(qū)窗价;
3、從內(nèi)存存儲角度來看:
(靜態(tài))數(shù)組從棧中分配空間, 對于程序員方便快速,但自由度小叹卷。
鏈表從堆中分配空間, 自由度大但申請管理比較麻煩舌镶。
數(shù)組利用下標定位,時間復(fù)雜度為O(1)豪娜,鏈表定位元素時間復(fù)雜度O(n)餐胀;
數(shù)組插入或刪除元素的時間復(fù)雜度O(n),鏈表的時間復(fù)雜度O(1)瘤载。
5否灾、說說你理解weak屬性?
Runtime維護了一個weak表鸣奔,用于存儲指向某個對象的所有weak指針墨技。weak表其實是一個hash(哈希)表,Key是所指對象的地址挎狸,Value是weak指針的地址(這個地址的值是所指對象的地址)數(shù)組扣汪。
1、初始化時:runtime會調(diào)用objc_initWeak函數(shù)锨匆,初始化一個新的weak指針指向?qū)ο蟮牡刂贰?/p>
2崭别、添加引用時:objc_initWeak函數(shù)會調(diào)用 objc_storeWeak() 函數(shù), objc_storeWeak() 的作用是更新指針指向恐锣,創(chuàng)建對應(yīng)的弱引用表茅主。
3夯秃、釋放時探赫,調(diào)用clearDeallocating函數(shù)。clearDeallocating函數(shù)首先根據(jù)對象地址獲取所有weak指針地址的數(shù)組妓湘,然后遍歷這個數(shù)組把其中的數(shù)據(jù)設(shè)為nil玷禽,最后把這個entry從weak表中刪除赫段,最后清理對象的記錄呀打。
1.實現(xiàn)weak后,為什么對象釋放后會自動為nil糯笙?
runtime 對注冊的類贬丛, 會進行布局,對于 weak 對象會放入一個 hash 表中炬丸。 用 weak 指向的對象內(nèi)存地址作為 key瘫寝,當此對象的引用計數(shù)為 0 的時候會 dealloc,假如 weak 指向的對象內(nèi)存地址是 a 稠炬,那么就會以 a 為鍵焕阿, 在這個 weak 表中搜索,找到所有以 a 為鍵的 weak 對象首启,從而設(shè)置為 nil 暮屡。
2.當weak引用指向的對象被釋放時,又是如何去處理weak指針的呢毅桃?
1褒纲、調(diào)用objc_release
2、因為對象的引用計數(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,詳細過程如下:
a. 從weak表中獲取廢棄對象的地址為鍵值的記錄
b. 將包含在記錄中的所有附有 weak修飾符變量的地址唇兑,賦值為 nil
c. 將weak表中該記錄刪除
d. 從引用計數(shù)表中刪除廢棄對象的地址為鍵值的記錄