iOS 編寫高質(zhì)量Objective-C代碼(八)

級別: ★★☆☆☆
標(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,watchOStvOS SDK中使用。

2. CoreFoundation:核心基礎(chǔ)框架。
提供了C語言級的基礎(chǔ)功能,為應(yīng)用程序提供基本數(shù)據(jù)管理和服務(wù)功能。并可通過無縫橋接技術(shù)(__bridge)實(shí)現(xiàn)C語言類與OC對象的轉(zhuǎn)換。

3. UIKit:視圖框架。
iOStvOS提供界面與視圖的功能。(重要:除非另有說明,否則一定要在主線程中使用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è)簡單的例子:NSArrayCFArrayRef的無縫橋接。

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):

  1. 如果分類和所屬類都定義了load方法,則會先調(diào)用主類里的load方法,然后再調(diào)用分類的。
  2. 在load方法內(nèi)使用其他類是不安全的。(因?yàn)檎{(diào)用時(shí)其他類可能還沒有加載好)
  3. 如果某個(gè)類本身沒有實(shí)現(xiàn)load方法,那么不管超類是否實(shí)現(xiàn)load方法都不會調(diào)用。
  4. load應(yīng)只用于調(diào)試,而非執(zhí)行任務(wù)。

initialize中的注意點(diǎn):

  1. 如果某個(gè)類未實(shí)現(xiàn)initialize,而其超類實(shí)現(xiàn)了,就會運(yùn)行超類的方法。
  2. 開發(fā)者無法控制類的初始化時(shí)機(jī)。
  3. 如果某個(gè)類的initizalize實(shí)現(xiàn)代碼很復(fù)雜,其中用到了別的類。若那些類還沒初始化,就會強(qiáng)迫他們初始化。
  4. 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)目——你話我猜升級版
奇舞周刊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,555評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內(nèi)容