級別: ★★☆☆☆
標(biāo)簽:「iOS」「Foundation」「Objective-C」
作者: MrLiuQ
審校: QiShare團(tuán)隊(duì)
前言:
這幾篇文章是小編在鉆研《Effective Objective-C 2.0》的知識產(chǎn)出,其中包含作者和小編的觀點(diǎn),以及小編整理的一些demo。希望能幫助大家以簡潔的文字快速領(lǐng)悟原作者的精華。
在這里,QiShare團(tuán)隊(duì)向原作者M(jìn)att Galloway表達(dá)誠摯的敬意。
文章目錄如下:
iOS 編寫高質(zhì)量Objective-C代碼(一)
iOS 編寫高質(zhì)量Objective-C代碼(二)
iOS 編寫高質(zhì)量Objective-C代碼(三)
iOS 編寫高質(zhì)量Objective-C代碼(四)
iOS 編寫高質(zhì)量Objective-C代碼(五)
iOS 編寫高質(zhì)量Objective-C代碼(六)
iOS 編寫高質(zhì)量Objective-C代碼(七)
iOS 編寫高質(zhì)量Objective-C代碼(八)
本篇的主題是:“系統(tǒng)框架”。
在我們?nèi)粘i_發(fā)中,都會使用系統(tǒng)的一些框架。因此熟悉系統(tǒng)框架是很有必要的。
那么今天,我們就一起來探索一下系統(tǒng)框架中有哪些珍寶呢?
一、熟悉系統(tǒng)框架
系統(tǒng)框架包括但不限于:
1. Foundation:基礎(chǔ)框架。
提供了包括數(shù)據(jù)存儲和持久性,文本處理,日期和時(shí)間計(jì)算,排序和過濾以及網(wǎng)絡(luò)等功能。Foundation定義的類,協(xié)議和數(shù)據(jù)類型在整個(gè)macOS
,iOS
,watchOS
和tvOS SDK
中使用。
2. CoreFoundation:核心基礎(chǔ)框架。
提供了C語言級的基礎(chǔ)功能,為應(yīng)用程序提供基本數(shù)據(jù)管理和服務(wù)功能。并可通過無縫橋接技術(shù)(__bridge
)實(shí)現(xiàn)C語言類與OC對象的轉(zhuǎn)換。
3. UIKit:視圖框架。
為iOS
與tvOS
提供界面與視圖的功能。(重要:除非另有說明,否則一定要在主線程中使用UIKit
框架。)
4. CoreAnimation:核心動畫框架。
提供了高幀速率和流暢的動畫功能,并且不會給CPU
太多負(fù)擔(dān),也不會降低應(yīng)用程序的響應(yīng)速度。
5. CoreGraphics:核心圖形框架。
基于Quartz繪圖引擎,提供了輕量級2D渲染所必備的數(shù)據(jù)結(jié)構(gòu)與函數(shù)。包括CGPoint
、CGSize
、CGRect
等數(shù)據(jù)結(jié)構(gòu)。
6. CoreData:核心數(shù)據(jù)框架。
提供了將OC對象寫入數(shù)據(jù)庫的功能,便于持久保存。
7. CoreText:文本框架。
提供了C語言級別的文字排版及渲染操作。
8. AVFoundation:音視頻框架。
提供了控制攝像頭,以及處理、合成、控制、導(dǎo)入、導(dǎo)出音頻/視頻的功能。
9. CFNetwork:網(wǎng)絡(luò)框架。
提供了C語言級別的網(wǎng)絡(luò)通信能力,將BSD socket抽象成易于使用的網(wǎng)絡(luò)接口,以便網(wǎng)絡(luò)通信。
10. ARKit:AR框架。
11. SpriteKit:2D游戲框架。
12. CoreLocation、MapKit:定位地圖相關(guān)框架。
13. Address Book:通訊錄框架。
14. HealthKit:健康相關(guān)框架。
15. HomeKit:為智能化硬件提供的框架。
16. PhotoKit:相冊框架。
......(還有很多框架,詳細(xì)的請看下面的官方文檔。)
PS:蘋果官方文檔
二、多用塊枚舉,少用for循環(huán)
遍歷collection有四種方法:for循環(huán)、NSEnumerator遍歷法、for-in快速遍歷法、塊枚舉法。
1. for循環(huán):
最基本的循環(huán)方法,與其他語言類似。
NSArray *arr = @[@1, @2, @3, @4, @5];
for (NSInteger i = 0; i < 5; i++) {
NSLog(@"%@",arr[i]);
}
2. NSEnumerator遍歷法:
NSArray *arr = @[@1, @2, @3, @4, @5];
NSEnumerator *enumerator = [arr objectEnumerator];
NSNumber *num = nil;
while ((num = [enumerator nextObject]) != nil) {
NSLog(@"%@",num);
}
3. for-in快速遍歷法:
在開發(fā)中,常使用的方法。
NSArray *arr = @[@1, @2, @3, @4, @5];
for (NSNumber *num in arr) {
NSLog(@"%@",num);
}
4. 塊枚舉法:
基于塊來遍歷,遍歷時(shí)既能獲取對象,也能知道其下標(biāo)。此外,還能通過stop
對象終止遍歷。(即調(diào)用*stop = YES
即可)
官方:
Executes a given block using each object in the array, starting with the first object and continuing through the array to the last object.
翻譯:使用數(shù)組中的每個(gè)對象執(zhí)行給定的block,從第一個(gè)對象開始,一直到最后一個(gè)對象。
基本使用:
NSArray *arr = @[@1, @2, @3, @4, @5];
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@",obj);
if (idx == arr.count - 1) {
*stop = YES;
}
}];
三、對自定義其內(nèi)存管理語義的collection使用無縫橋接
無線橋接技術(shù)(__bridge
):可將“OC對象”與“C語言中的數(shù)據(jù)結(jié)構(gòu)”來回轉(zhuǎn)換。
舉個(gè)簡單的例子:NSArray
與CFArrayRef
的無縫橋接。
NSArray *anNSArray = @[@1, @2, @3, @4, @5];
CFArrayRef aCFArray = (__bridge CFArrayRef)anNSArray;//!< 無縫橋接
NSLog(@"Size of array = %li", CFArrayGetCount(aCFArray));
// Output: Size of array = 5
四、構(gòu)建緩存時(shí)選用NSCache而非NSDictionary
NSCache的優(yōu)點(diǎn):
- 當(dāng)系統(tǒng)資源將要耗盡時(shí),
NSCache
會自動刪減。并先行刪除“最久未使用的對象”。 -
NSCache
不會自動拷貝鍵。(PS:因?yàn)?code>NSCache沒有遵循<NSCopying>
/<NSMutableCopying>
協(xié)議) -
NSCache
是線程安全的。在不加同步鎖的前提下,依然支持多線程訪問NSCache
。
五、精簡load與initialize的實(shí)現(xiàn)代碼
load與initialize方法都要保持精簡。
load
中的注意點(diǎn):
- 如果分類和所屬類都定義了load方法,則會先調(diào)用主類里的load方法,然后再調(diào)用分類的。
- 在load方法內(nèi)使用其他類是不安全的。(因?yàn)檎{(diào)用時(shí)其他類可能還沒有加載好)
- 如果某個(gè)類本身沒有實(shí)現(xiàn)load方法,那么不管超類是否實(shí)現(xiàn)load方法都不會調(diào)用。
- load應(yīng)只用于調(diào)試,而非執(zhí)行任務(wù)。
initialize
中的注意點(diǎn):
- 如果某個(gè)類未實(shí)現(xiàn)initialize,而其超類實(shí)現(xiàn)了,就會運(yùn)行超類的方法。
- 開發(fā)者無法控制類的初始化時(shí)機(jī)。
- 如果某個(gè)類的initizalize實(shí)現(xiàn)代碼很復(fù)雜,其中用到了別的類。若那些類還沒初始化,就會強(qiáng)迫他們初始化。
- initialize方法只應(yīng)該用來設(shè)置內(nèi)部數(shù)據(jù)。
六、別忘了NSTimer會保留其目標(biāo)對象
NSTimer
對象會保留其目標(biāo),直到計(jì)時(shí)器本身失效為止,調(diào)用[_timer invalidate];
可令計(jì)時(shí)器失效。另外,一次性的計(jì)時(shí)器在觸發(fā)完任務(wù)后也會失效。反復(fù)執(zhí)行任務(wù)的計(jì)時(shí)器(
repeating timer
)很容易產(chǎn)生循環(huán)引用。如果這種計(jì)時(shí)器的目標(biāo)對象又保留了計(jì)時(shí)器本身,那就會產(chǎn)生循環(huán)引用,導(dǎo)致內(nèi)存泄漏。可能是直接發(fā)生的,也可能是其他對象間接發(fā)生的。
了解更多iOS及相關(guān)新技術(shù),請關(guān)注我們的公眾號:
關(guān)注我們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號)
推薦文章:
iOS KVC與KVO簡介
iOS 本地化(IB篇)
iOS 本地化(非IB篇)
iOS 小游戲項(xiàng)目——數(shù)字速算升級版
iOS 小游戲項(xiàng)目——你話我猜升級版
奇舞周刊