這幾天遇到了幾個問題,順手寫下自己的理解,也當(dāng)拋磚引玉了宪郊。
- 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.
- 同步的并行隊列運行是如何的弛槐?
有序執(zhí)行,同步意味著只有一條線程懊亡,并行意味著任務(wù)按照順序執(zhí)行。所以說有序的乎串。同步阻塞當(dāng)前線程店枣,異步不阻塞當(dāng)前線程。 - UITableView 卡頓的解決方案叹誉?
緩存高度計算鸯两,異步渲染,離屏渲染长豁。 - Weak 對象為什么釋放之后自動設(shè)置為 nil 钧唐?
id obj1 = 0;(該語句表示指針為空)
objc_storeWeak(&obj1, obj);
objc_destoryWeak函數(shù)將0作為參數(shù)調(diào)用objc_storeWeak函數(shù)。
objc_storeWeak(&obj1, 0);
前面的代碼與下面的代碼相同蕉斜。
編譯器的模擬代碼:
id obj1;
obj1 = 0;
objc_storeWeak(&obj1, obj);
objc_storeWeak(&obj1, 0);
objc_storeWeak函數(shù)把第二個參數(shù)obj賦值對象的內(nèi)存地址作為鍵值逾柿,將第一個參數(shù)附有__weak修飾變量obj1的內(nèi)存地址注冊到weak表中;如果第二個參數(shù)為0宅此,則把變量obj1的內(nèi)存地址從weak表中刪除。
對象被廢棄的時候會調(diào)用objc_clear_deallocating函數(shù)爬范,該函數(shù)會做如下的處理:
1.從weak表中獲取釋放對象的地址為鍵值的記錄父腕。
2.將包含在記錄中所有附有__weak修飾變量的地址,賦值為nil青瀑。
3.從weak表中刪除該記錄璧亮。
4.從引用計數(shù)表中刪除釋放對象的地址為鍵值的記錄。
http://www.reibang.com/p/050b2d2bc91c
- __block 關(guān)鍵字修飾需要被修改的變量的原理是什么斥难?MRC 和 ARC 上有區(qū)別嗎?
__block 修飾的外部變量引用枝嘶,block 是復(fù)制其引用地址來實現(xiàn)訪問的。ARC 開啟的情況下哑诊,將只會有 NSConcreteGlobalBlock 和 NSConcreteMallocBlock 類型的 block群扶。 - 怎么樣能夠一直保持線程?
手動創(chuàng)建的線程都由開發(fā)人員管理,所以手動建立線程就能保持線程镀裤。
7.MagicRecord 是如何實現(xiàn)多線程同步的竞阐? - 如何實現(xiàn) KVO 編程?
KVO是基于runtime機制實現(xiàn)的
當(dāng)某個類的屬性對象第一次被觀察時暑劝,系統(tǒng)就會在運行期間動態(tài)地創(chuàng)建該類的一個派生類骆莹,在這個派生類中重寫基類的任何被觀察屬性的setter方法。派生類在被重寫的setter方法內(nèi)實現(xiàn)真正的通知機制
如果原類為Person担猛,那么生成的派生類名為NSKVONotifying_Person
我們知道幕垦,每一個類中都有一個isa指針指向當(dāng)前類丢氢,所有系統(tǒng)就是在當(dāng)一個類的對象第一次被觀察的時候,系統(tǒng)就會偷偷將isa指針指向動態(tài)生成的派生類先改,從而在被監(jiān)聽屬性賦值時被執(zhí)行的是派生類的setter方法
鍵值觀察通知依賴于NSObject 的兩個方法: willChangeValueForKey: 和 didChangevlueForKey:疚察;在一個被觀察屬性發(fā)生改變之前, willChangeValueForKey: 一定會被調(diào)用盏道,這就 會記錄舊的值稍浆。而當(dāng)改變發(fā)生后,didChangeValueForKey: 會被調(diào)用猜嘱,繼而 observeValueForKey:ofObject:change:context: 也會被調(diào)用衅枫。
補充:KVO的這套實現(xiàn)機制中蘋果還偷偷重寫了class方法,讓我們誤認(rèn)為還是使用的當(dāng)前類朗伶,從而達到隱藏生成的派生類
- 字體適配如何實現(xiàn)弦撩?
- 響應(yīng)鏈的方向?
hitTest 找到點擊的對象论皆,然后向上(superView)查找響應(yīng)的對應(yīng)方法益楼。 - copy 關(guān)鍵字作用?
(1).NSString点晴、NSArray感凤、NSDictionary 等等經(jīng)常使用copy關(guān)鍵字,是因為他們有對應(yīng)的可變類型:NSMutableString粒督、NSMutableArray陪竿、NSMutableDictionary;
(2).block 也經(jīng)常使用 copy 關(guān)鍵字屠橄,具體原因見官方文檔:Objects Use Properties to Keep Track of Blocks: