iOS編程實(shí)戰(zhàn)
讀書筆記
1.弱引用容器
常見的容器有NSArray
, NSSet
和 NSDictionary
;
NSArray
和NSSet
會(huì)保留保存在其中的對(duì)象,
NSDictionary
不光會(huì)保留值,還要復(fù)制鍵.
從iOS6開始有了新的容器類:NSPointerArray
, NSHashTable
和NSMapTable
, 它們統(tǒng)稱為指針容器類, 有時(shí)候配置為使用NSPointerFuntions
類
- NSPointerArray 類似于 NSArray
- NSHashTable 類似于 NSSet
- NSMapTable 類似于 NSDictionary
這些新容器都可以配置為持有弱引用/非對(duì)象的指針或者其他罕見情形, NSPointerArray還有一個(gè)好處是可以存戶Null值.
2. UIKit和視圖繪圖周期
- iOS在運(yùn)行循環(huán)中整合所有的繪圖請(qǐng)求, 并一次將他們繪制出來
- 不能在主線程中進(jìn)行復(fù)雜的處理
- 不能在主線程之外的主視圖上下文中繪制. 開發(fā)者需要檢查每個(gè)UIKit方法以確保它沒有主線程需求. 只要不是在主線程繪制. 一些UIKit方法是可以在后臺(tái)線程中使用的.
3.視圖繪制與視圖布局
- 如果一個(gè)視圖調(diào)用了 setNeedsDisplay方法, 他就被標(biāo)記為"需要刷新的", 并且會(huì)在下一次繪圖周期中重新繪制.
- 如果數(shù)據(jù)改變后只需要進(jìn)行布局更新(而非繪制), 則可以調(diào)用 setNeedsDisplay方法.
4.混用UIKit和Core Graphics
在 drawRect: 方法之外, 你可能會(huì)發(fā)現(xiàn)使用Core Graphics繪制的東西上下顛倒. 這個(gè)是因?yàn)樽鴺?biāo)系不同的原因. UIKit是左上點(diǎn)為原點(diǎn), 而Core Graphics的原點(diǎn)是在左下.
只要使用 drawRect: 方法中的 UIGraphicsGetCurrentContext 返回的上下文, 那么一切都是正常的, 因?yàn)檫@個(gè)上下文是已經(jīng)翻轉(zhuǎn)過的. 不過, 如果使用CGBitmapContextCreate 這樣的函數(shù)創(chuàng)建自己的上下文, 它會(huì)以左下角為原點(diǎn). 可以進(jìn)行反向計(jì)算或者翻轉(zhuǎn)上下文:
- Core Graphics 轉(zhuǎn) UIKit, 先平移了上下文的高度并使用一個(gè)負(fù)數(shù)比例進(jìn)行反轉(zhuǎn).
CGContextTranslateCTM(context, 0.0f, height);
CGContextScaleCTM(context, 1.0f, -1.0f);
- UIKit 轉(zhuǎn) Core Graphics 先反轉(zhuǎn), 然后平移.
CGContextScaleCTM(context, 1.0f, -1.0f);
CGContextTranslateCTM(context, 0.0f, -height);
5.透明(alpha),不透明(opaque)與隱藏(hidden)
看似有關(guān)實(shí)際無關(guān)的屬性
alpha
alpha 屬性決定了視圖會(huì)通過像素顯示多少信息. 1
意味著所有的視圖信息都在像素上表現(xiàn)出來, 0
意味著沒有視圖信息能在像素上顯示出來.
iPhone上沒有東西是真正透明的. 說到底, 它只是關(guān)于如何繪制像素的問題.
opaque
opaque并不會(huì)實(shí)際升高或降低它的透明度. 繪圖系統(tǒng)會(huì)根據(jù)opaque來優(yōu)化. 如果視圖標(biāo)記為opaque, 便是向繪圖系統(tǒng)'許諾'即將繪制的每一個(gè)像素都要使用全部透明的顏色. 這便允許繪圖系統(tǒng)忽略在下面的視圖, 這樣可以改善性能, 尤其是在進(jìn)行變性時(shí). 但是視圖中有特定的透明區(qū)域, 或者并不繪制矩形所有像素, 設(shè)置opaque會(huì)導(dǎo)致不可預(yù)測(cè)的結(jié)果.設(shè)置一個(gè)非透明的backgroundColor屬性可以確保繪制所有像素.
與opaque緊密相關(guān)的是 clearsContextBeforeDrawing. 它的默認(rèn)值為Yes, 而且會(huì)在調(diào)用 drawRect:之前將上下文設(shè)置為透明黑底. 這會(huì)避免視圖中的任何垃圾數(shù)據(jù). 這種操作非炒缆幔快, 不過如果打算繪制每一個(gè)像素, 將其設(shè)置為 NO 可能會(huì)好些.
hidden
hidden代表視圖并不會(huì)被繪制. 它通常等同于 alpha 為0, 以為hidden屬性不能產(chǎn)生動(dòng)畫效果. 所以通常還是以動(dòng)畫模擬 alpha 到值 0的方法隱藏視圖.
你可以創(chuàng)建一個(gè)透明視圖來接收事件. alpha 為 1 , opaque 為 NO 且 backgroundColor 為nil 或 [UIColor clearColor] 來接收觸摸事件. 如果用于碰撞檢測(cè), 擁有透明背景的視圖仍然被認(rèn)為是可視的.