iOS 的技術解釋

這幾天遇到了幾個問題,順手寫下自己的理解,也當拋磚引玉了。

  1. UIButton 引用的 target 是強引用還是弱引用?那么 NSTimer 呢?
    UIControl 文檔

The control does not retain the object in the target parameter. It is your responsibility to maintain a strong reference to the target object while it is attached to a control.
https://developer.apple.com/documentation/uikit/uicontrol/1618259-addtarget

NSTimer 文檔

The timer maintains a strong reference to this object until it (the timer) is invalidated.

  1. 同步的并行隊列運行是如何的?
    有序執行,同步意味著只有一條線程,并行意味著任務按照順序執行。所以說有序的。同步阻塞當前線程,異步不阻塞當前線程。
  2. UITableView 卡頓的解決方案?
    緩存高度計算,異步渲染,離屏渲染。
  3. Weak 對象為什么釋放之后自動設置為 nil ?

id obj1 = 0;(該語句表示指針為空)
objc_storeWeak(&obj1, obj);
objc_destoryWeak函數將0作為參數調用objc_storeWeak函數。
objc_storeWeak(&obj1, 0);
前面的代碼與下面的代碼相同。
編譯器的模擬代碼:
id obj1;
obj1 = 0;
objc_storeWeak(&obj1, obj);
objc_storeWeak(&obj1, 0);

objc_storeWeak函數把第二個參數obj賦值對象的內存地址作為鍵值,將第一個參數附有__weak修飾變量obj1的內存地址注冊到weak表中;如果第二個參數為0,則把變量obj1的內存地址從weak表中刪除。

對象被廢棄的時候會調用objc_clear_deallocating函數,該函數會做如下的處理:

1.從weak表中獲取釋放對象的地址為鍵值的記錄。
2.將包含在記錄中所有附有__weak修飾變量的地址,賦值為nil。
3.從weak表中刪除該記錄。
4.從引用計數表中刪除釋放對象的地址為鍵值的記錄。

http://www.lxweimin.com/p/050b2d2bc91c

  1. __block 關鍵字修飾需要被修改的變量的原理是什么?MRC 和 ARC 上有區別嗎?
    __block 修飾的外部變量引用,block 是復制其引用地址來實現訪問的。ARC 開啟的情況下,將只會有 NSConcreteGlobalBlock 和 NSConcreteMallocBlock 類型的 block。
  2. 怎么樣能夠一直保持線程?
    手動創建的線程都由開發人員管理,所以手動建立線程就能保持線程。
    7.MagicRecord 是如何實現多線程同步的?
  3. 如何實現 KVO 編程?

KVO是基于runtime機制實現的
當某個類的屬性對象第一次被觀察時,系統就會在運行期間動態地創建該類的一個派生類,在這個派生類中重寫基類的任何被觀察屬性的setter方法。派生類在被重寫的setter方法內實現真正的通知機制
如果原類為Person,那么生成的派生類名為NSKVONotifying_Person
我們知道,每一個類中都有一個isa指針指向當前類,所有系統就是在當一個類的對象第一次被觀察的時候,系統就會偷偷將isa指針指向動態生成的派生類,從而在被監聽屬性賦值時被執行的是派生類的setter方法
鍵值觀察通知依賴于NSObject 的兩個方法: willChangeValueForKey: 和 didChangevlueForKey:;在一個被觀察屬性發生改變之前, willChangeValueForKey: 一定會被調用,這就 會記錄舊的值。而當改變發生后,didChangeValueForKey: 會被調用,繼而 observeValueForKey:ofObject:change:context: 也會被調用。
補充:KVO的這套實現機制中蘋果還偷偷重寫了class方法,讓我們誤認為還是使用的當前類,從而達到隱藏生成的派生類

  1. 字體適配如何實現?
  2. 響應鏈的方向?
    hitTest 找到點擊的對象,然后向上(superView)查找響應的對應方法。
  3. copy 關鍵字作用?

(1).NSString、NSArray、NSDictionary 等等經常使用copy關鍵字,是因為他們有對應的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary;
(2).block 也經常使用 copy 關鍵字,具體原因見官方文檔:Objects Use Properties to Keep Track of Blocks:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容