級別: ★★☆☆☆
標籤:「iOS」「Foundation」「Objective-C」
作者: MrLiuQ
審校: QiShare團隊
前言:
這幾篇文章是小編在鑽研《Effective Objective-C 2.0》的知識產出,其中包含作者和小編的觀點,以及小編整理的一些demo。希望能幫助大家以簡潔的文字快速領悟原作者的精華。
在這裡,QiShare團隊向原作者Matt Galloway表達誠摯的敬意。
文章目錄如下:
iOS 編寫高質量Objective-C程式碼(一)
iOS 編寫高質量Objective-C程式碼(二)
iOS 編寫高質量Objective-C程式碼(三)
iOS 編寫高質量Objective-C程式碼(四)
iOS 編寫高質量Objective-C程式碼(五)
iOS 編寫高質量Objective-C程式碼(六)
iOS 編寫高質量Objective-C程式碼(七)
iOS 編寫高質量Objective-C程式碼(八)
本篇的主題是:“系統框架”。 在我們日常開發中,都會使用系統的一些框架。因此熟悉系統框架是很有必要的。 那麼今天,我們就一起來探索一下系統框架中有哪些珍寶呢?
一、熟悉系統框架
系統框架包括但不限於:
1. Foundation:基礎框架。
提供了包括資料儲存和永續性,文字處理,日期和時間計算,排序和過濾以及網路等功能。Foundation定義的類,協議和資料型別在整個macOS
,iOS
,watchOS
和tvOS SDK
中使用。
2. CoreFoundation:核心基礎框架。
提供了C語言級的基礎功能,為應用程式提供基本資料管理和服務功能。並可通過無縫橋接技術(__bridge
)實現C語言類與OC物件的轉換。
3. UIKit:檢視框架。
為iOS
與tvOS
提供介面與檢視的功能。(重要:除非另有說明,否則一定要在主執行緒中使用UIKit
框架。)
4. CoreAnimation:核心動畫框架。
提供了高幀速率和流暢的動畫功能,並且不會給CPU
太多負擔,也不會降低應用程式的響應速度。
5. CoreGraphics:核心圖形框架。
基於Quartz繪圖引擎,提供了輕量級2D渲染所必備的資料結構與函式。包括CGPoint
、CGSize
、CGRect
等資料結構。
6. CoreData:核心資料框架。
提供了將OC物件寫入資料庫的功能,便於持久儲存。
7. CoreText:文字框架。
提供了C語言級別的文字排版及渲染操作。
8. AVFoundation:音視訊框架。
提供了控制攝像頭,以及處理、合成、控制、匯入、匯出音訊/視訊的功能。
9. CFNetwork:網路框架。
提供了C語言級別的網路通訊能力,將BSD socket抽象成易於使用的網路介面,以便網路通訊。
10. ARKit:AR框架。
11. SpriteKit:2D遊戲框架。
12. CoreLocation、MapKit:定位地圖相關框架。
13. Address Book:通訊錄框架。
14. HealthKit:健康相關框架。
15. HomeKit:為智慧化硬體提供的框架。
16. PhotoKit:相簿框架。
......(還有很多框架,詳細的請看下面的官方文件。)
PS:蘋果官方文件
二、多用塊列舉,少用for迴圈
遍歷collection有四種方法:for迴圈、NSEnumerator遍歷法、for-in快速遍歷法、塊列舉法。
1. for迴圈:
最基本的迴圈方法,與其他語言類似。
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快速遍歷法:
在開發中,常使用的方法。
NSArray *arr = @[@1, @2, @3, @4, @5];
for (NSNumber *num in arr) {
NSLog(@"%@",num);
}
複製程式碼
4. 塊列舉法:
基於塊來遍歷,遍歷時既能獲取物件,也能知道其下標。此外,還能通過stop
物件終止遍歷。(即呼叫*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.
-
翻譯:使用陣列中的每個物件執行給定的block,從第一個物件開始,一直到最後一個物件。
-
基本使用:
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;
}
}];
複製程式碼
三、對自定義其記憶體管理語義的collection使用無縫橋接
無線橋接技術(__bridge
):可將 “OC物件” 與 “C語言中的資料結構” 來回轉換。
舉個簡單的例子: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
複製程式碼
四、構建快取時選用NSCache而非NSDictionary
NSCache的優點:
- 當系統資源將要耗盡時,
NSCache
會自動刪減。並先行刪除***“最久未使用的物件”***。 NSCache
不會自動拷貝鍵。(PS:因為NSCache
沒有遵循<NSCopying>
/<NSMutableCopying>
協議)NSCache
是執行緒安全的。在不加同步鎖的前提下,依然支援多執行緒訪問NSCache
。
五、精簡load與initialize的實現程式碼
load與initialize方法都要保持精簡。
load
中的注意點:
- 如果分類和所屬類都定義了load方法,則會先呼叫主類裡的load方法,然後再呼叫分類的。
- 在load方法內使用其他類是不安全的。(因為呼叫時其他類可能還沒有載入好)
- 如果某個類本身沒有實現load方法,那麼不管超類是否實現load方法都不會呼叫。
- load應只用於除錯,而非執行任務。
initialize
中的注意點:
- 如果某個類未實現initialize,而其超類實現了,就會執行超類的方法。
- 開發者無法控制類的初始化時機。
- 如果某個類的initizalize實現程式碼很複雜,其中用到了別的類。若那些類還沒初始化,就會強迫他們初始化。
- initialize方法只應該用來設定內部資料。
六、別忘了NSTimer會保留其目標物件
-
NSTimer
物件會保留其目標,直到計時器本身失效為止,呼叫[_timer invalidate];
可令計時器失效。另外,一次性的計時器在觸發完任務後也會失效。 -
反覆執行任務的計時器(
repeating timer
)很容易產生迴圈引用。如果這種計時器的目標物件又保留了計時器本身,那就會產生迴圈引用,導致記憶體洩漏。可能是直接發生的,也可能是其他物件間接發生的。
關注我們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號)
推薦文章:
iOS KVC與KVO簡介
iOS 本地化(IB篇)
iOS 本地化(非IB篇)
iOS 小遊戲專案——數字速算升級版
iOS 小遊戲專案——你話我猜升級版
奇舞週刊