ios 面試那些事

mindX發表於2019-03-26

當你寫下面程式碼會發生什麼事

least = MIN(*p++, b);
結果是:((p++ <= (b)? (p++): (*p++)))
這個表示式會產生副作用,指標p會做三次自增操作
複製程式碼

NSString 用copy 還是 strong修飾

oc中NSString 為不可變字串是,用copy和strong 都只是分配一次記憶體,但是如果用copy的時候需要先判斷字串是否是不可變字串,如果不是可變字串,就不在分配空間,如果是可變字串在分配空間,這樣就會有效能消耗,如果程式用使用的的NSString是不可變的字串就可以使用strong修飾
複製程式碼

@synthesize 和@dynamic 的作用

- @property 有兩個對應的詞,一個是 @synthesize 一個是@dynamic。如果 @synthesize 和 @dynamic 都沒寫,那麼就預設是@synthesize var = _var;
- @synthesize 的語義是如果你沒有手動實現setter和getter 方法 那麼編譯器就會自動為你新增這兩個方法
- @dynamic 告訴編譯器:屬性的setter和getter 方法有使用者自己實現,不自動生成(當然對於readonly的屬性只需提供getter即可)。假如一個屬性被宣告為@dynamic var,然後你沒有提供setter和getter方法,編譯的時候沒有問題,但是當程式執行到 instance。var = someVar 的時候,由於缺少setter 方法會導致程式的崩潰,或者當執行到someVar = var時,由於缺getter方法同樣會導致崩潰,編譯是沒有問題的,執行的時候才回去執行相應的方法,這就是所謂的動態繫結
複製程式碼

notificationCenter,KVC,KVO,Delegate 他們之間有什麼區別

- KVO:一對多,觀察者模式,鍵值觀察機制,他提供了觀察某一個屬性變化的方法,極大簡化了程式碼
- KVC: 是鍵值編碼,一個物件在呼叫setValue的時候
    . 檢查是否存在相應的key的set方法,存在就呼叫set方法
    . set方法不存在,就查詢_key的成員變是夠存在,存在就直接賦值
    . 如果_key沒找到,就找同名的key,存在就賦值
    . 如果沒有有就呼叫valueForUndefinedkey和setValue:forUndefindkey.
- Delegate:通常傳送者和接受者的關係是一對一的關係
    . 代理的目的就是改變傳輸控制鏈,允許一個淚在某些特定時刻通知到其他類,而不需要要獲取到哪些類的指標
    . 可以減少框架的複雜度,訊息大宋這(sender)告知接收者(receiver)某個時間將要發生,delegate同意然後傳送者響應事件,delegate機制是的接收者可以改變傳送者的行為
- notification:觀察者模式,通常傳送者和接收者的關係是間接地多堆垛關係,訊息的傳送者告知接收者事件已經發生或將要傳送,僅此而已,接收者並不能反過來影響傳送者的行為
區別:
    - 效率肯定是delegate比notification高
    - delegate方法比notification更加直接,需要關注返回值,所以delegate方法往往包含should這個傳神的詞,相反,notification最大的特色就是不關心結果,所以往往用did這個詞
    - 兩個模組之間聯絡不是很緊密,就用notification,例如多執行緒之間的傳值
    - delegate 只是一種極為簡單的回撥,且主要用在一個模組中,例如底層功能完成了需要把一些值傳到上層去,就事先把上層的函式通過delegate傳到底層,然後在calldelegate,他們都在一個模組中,完成一個功能,例如說navgationController 從b介面到a點返回按鈕(呼叫popViewController)方法
複製程式碼

未完待續.........

相關文章