iOS面試題總結(三)

Crazy巴旦木發表於2018-10-23

面試總結一傳送門:面試總結一
面試總結二傳送門:面試總結一
斷更了好長時間突然看到面試題,繼續寫,基礎知識不能落下,前段時間研究WKWebView的快取方面的問題,遇到了很多問題都解決了,很有收穫,感興趣的可以去前面翻翻看看。 前面兩篇文章的題目來自招聘一個靠譜的iOS。 下面寫的題目來自出一套 iOS 高階面試題 繼續鞏固基礎知識!

分類和擴充套件有什麼區別?可以分別用來做什麼?分類有哪些侷限性?分類的結構體裡面有哪些成員?

分類的作用

1.可以在不修改原來類的基礎上,為一個類擴充套件方法。
2.最主要的用法:給系統自帶的類擴充套件方法。

使用分類注意

1.分類只能新增“方法”,不能增加成員變數。
2.分類可以訪問原來類中的成員變數,但是隻能訪問@protect和@publish形式的成員變數。如果想訪問本來的私有變數,分類和子類一樣,只能通過方法訪問。 3.如果一定要在分類中新增成員變數,可以通過getter,setter手段進行新增。

分類的執行優先順序

1.本類和分類有相同方法時,優先呼叫分類的方法再呼叫本類的方法。
2.如果兩個風雷都實現了同樣的方法,分類執行順序可以通過targets,Build Phases,Complie Source進行調節,注意執行順序是從上到下的。

分類和擴充套件的關係

1.類擴充套件是category的一個特例,也被稱為匿名分類。作用是為一個類新增一些私有的成員變數和方法。
2.與分類不同的是,類擴充套件可以宣告成員變數和方法。
3.類擴充套件定義在.m裡面,定義的變數都是私有的。 4.類擴充套件定義的方法一定要實現,category沒這樣的限制。

答案來自深入淺出理解分類(category)和類擴充套件(extension)

講一下atomic的實現機制;為什麼不能保證絕對的執行緒安全(最好可以結合場景來說)?

atomic是安全的, 而且是絕對安全的。執行緒是不一定安全的。atomic所說的執行緒安全只是保證了getter和setter存取方法的執行緒安全,並不能保證整個物件是執行緒安全的。
例如:當執行緒A進行寫操作,這時其他執行緒的讀或者寫操作會因為該操作而等待。當A執行緒的寫操作結束後,B執行緒進行寫操作,然後當A執行緒需要讀操作時,卻獲得了在B執行緒中的值,這就破壞了執行緒安全,如果有執行緒C在A執行緒讀操作前release了該屬性,那麼還會導致程式崩潰。所以僅僅使用atomic並不會使得執行緒安全,我們還要為執行緒新增lock來確保執行緒的安全。
又例如:如果一個執行緒迴圈的讀資料,一個執行緒迴圈寫資料,那麼肯定會產生記憶體問題,因為這和setter、getter沒有關係。如使用[self.arr objectAtIndex:index]就不是執行緒安全的。好的解決方案就是加鎖。

延伸 給執行緒加鎖

來源:使用atomic一定是執行緒安全的嗎?

被weak修飾的物件在被釋放的時候會發生什麼?是如何實現的?知道sideTable麼?裡面的結構可以畫出來麼?

大神講的很明白iOS 底層解析weak的實現原理(包含weak物件的初始化,引用,釋放的分析)

關聯物件有什麼應用,系統如何管理關聯物件?其被釋放的時候需要手動將所有的關聯物件的指標置空麼?

很詳細而且所有問題都回答了AssociatedObject關聯物件原理實現,也可以看看這篇關聯物件 AssociatedObject 完全解析

KVO的底層實現?如何取消系統預設的KVO並手動觸發(給KVO的觸發設定條件:改變的值符合某個條件時再觸發KVO)?

很詳細詳細的回答刨根問底KVO原理

Autoreleasepool所使用的資料結構是什麼?AutoreleasePoolPage結構體瞭解麼?

AutoreleasePoolPage,看這個autoreleasepool是如何實現的?,這個更深入一點深入理解@autoreleasepool

講一下物件,類物件,元類,跟元類結構體的組成以及他們是如何相關聯的?為什麼物件方法沒有儲存的物件結構體裡,而是儲存在類物件的結構體裡?

物件isa指向類物件,類物件的isa指向元類。元類isa指向根元類。 根元類的isa指標指向自己,superclass指標指向NSObject類 例項物件結構體只有一個isa變數,指向例項物件所屬的類。 類物件有isa,superclass,方法,屬性,協議列表,以及成員變數的 描述。 所有的物件呼叫方法都是一樣的,沒有必要存在物件中,物件可以有 無數個,類物件就有一個所以只需存放在類物件中。 參考:iOS開發·runtime原理與實踐: 基本知識篇(類,超類,元類,super_class,isa,物件,方法,SEL,IMP)

class_ro_t 和 class_rw_t 的區別?

參考:深入解析 ObjC 中方法的結構

iOS 中內省的幾個方法?class方法和objc_getClass方法有什麼區別?

內省參考:Objective-C的內省(Introspection)小結,區別參考:object_getClass(obj)與[obj class]的區別

在執行時建立類的方法objc_allocateClassPair的方法名尾部為什麼是pair(成對的意思)?

另一半是mate-class,參考:詳解Objective-C的meta-class

一個int變數被__block修飾與否的區別?

如果在block內部修改int變數的值,需要加__block,否則會報錯誤(Variable is not assignable (missing __block type specifier))

為什麼在block外部使用__weak修飾的同時需要在內部使用__strong修飾?

我們常常會使用__weak 的修飾符來修飾一個變數,防止其在block中被迴圈引用,但是有些特殊情況下,我們在block中又使用__strong 來修飾這個在block外剛剛用__weak修飾的變數,當加上修飾符strong時,當別處把變數釋放掉,但呼叫該變數的block如果仍然沒有執行結束,那麼系統就會等待block執行完成後再釋放,對該變數在block中的使用起到了保護作用。當block執行結束後會自動釋放掉。

哪些場景可以觸發離屏渲染?

參考,講的很全:離屏渲染詳解

相關文章