章節(jié)
- 開(kāi)發(fā)工具
- 開(kāi)發(fā)語(yǔ)言
- Kotlin & Swift
- 系統(tǒng)機(jī)制
- 工程文件結(jié)構(gòu)
- 界面繪制
- 數(shù)據(jù)存儲(chǔ)與傳遞
- 多線程與同步
1. 開(kāi)發(fā)工具
- Android使用Android Studio開(kāi)發(fā)套件,基于IntelliJ IDEA,具有強(qiáng)大的文件編輯功能。自帶的模擬器不好用,需要搭配Gynemotion模擬器。
- iOS主要使用XCode開(kāi)發(fā),可以搭配AppCode做文件編輯器。
| 功能特性 | Android Studio | XCode |
|---|---|---|
| 查看類或方法的引用處 | Yes,方便 | Yes,略麻煩 |
| 查看類的繼承關(guān)系 | Yes | No |
| 全局搜索支持正則 | Yes | No |
| log查看 | 方便,支持tag過(guò)濾 | 不方便 |
| 文件編輯易用性 | Yes | No |
| 模擬器 | 啟動(dòng)慢,不好用 | 啟動(dòng)快 |
| 手機(jī)調(diào)試-緩存文件 | 容易抓取緩存文件 | 需要破解 |
| 支付調(diào)試 | 簡(jiǎn)單、可靠 | 復(fù)雜、不可靠 |
2. 開(kāi)發(fā)語(yǔ)言
- Android主要使用Java開(kāi)發(fā),是靜態(tài)語(yǔ)言,語(yǔ)法和主流語(yǔ)言比較類似。
- iOS主要使用Objective-c(后邊用OC代稱)開(kāi)發(fā),是動(dòng)態(tài)語(yǔ)言,語(yǔ)法使用上有個(gè)性。
2.1 點(diǎn)語(yǔ)法和中括號(hào)
Java的方法調(diào)用這樣:
String s2 = s1.replace(“abc”,”xyz”);
OC的方法調(diào)用這樣:
NSString *s2 = [s1 stringByReplacingOccurrencesOfString:@"abc" withString:@"xyz"];
2.2 命名空間
- Java類有包路徑,一般不會(huì)出現(xiàn)類名重復(fù)沖突。
- OC類沒(méi)有命名空間,通常都加2個(gè)大寫(xiě)字母的類名全綴,并且OC推崇完整拼寫(xiě)的長(zhǎng)類名和方法名。
2.3 函數(shù)定義
Java沒(méi)有頭文件。函數(shù)定義形如:
@Override
public void logThrowable(String eventName, Throwable throwable) { xxx }
OC有頭文件。函數(shù)聲明形如:
-(void)achievementToCommentWithAlbumId:(NSString *)albumId
MusicId:(NSString *)musicId
index:(NSString *)index
adverId:(NSString *)adverId;
- 為了提高函數(shù)調(diào)用效率,Java虛擬機(jī)為每個(gè)類建立了一個(gè)函數(shù)表。調(diào)用時(shí),根據(jù)方法簽名(函數(shù)名+參數(shù)列表)查找。編譯期會(huì)檢查方法是否存在,不能調(diào)用不存在的方法。
- OC的方法調(diào)用,其本質(zhì)是消息轉(zhuǎn)發(fā)。Runtime會(huì)轉(zhuǎn)換成objc_msgSend(self, _cmd)。因此可以調(diào)用編譯期不存在的方法。消息機(jī)制也是OC動(dòng)態(tài)特性的本質(zhì),可以運(yùn)行時(shí)增刪改類和函數(shù)。
2.4 靜態(tài)語(yǔ)言 & 動(dòng)態(tài)語(yǔ)言
- 動(dòng)態(tài)類型語(yǔ)言:指在運(yùn)行期間才去做數(shù)據(jù)類型檢查,也就是說(shuō),用動(dòng)態(tài)語(yǔ)言編程時(shí),永遠(yuǎn)不用去給任何變量去指定數(shù)據(jù)類型。該語(yǔ)言會(huì)在你第一次給該變量賦值的時(shí)候,在內(nèi)部把數(shù)據(jù)類型記錄下來(lái)。如ruby、Python、OC等。
- 靜態(tài)類型語(yǔ)言:指在編譯期間就去做數(shù)據(jù)類型檢查,編譯器必須知道所有類和函數(shù)的所有信息,也就是說(shuō)在編碼時(shí)要聲明數(shù)據(jù)類型。如Java和c、c++、swift等。
- Java是靜態(tài)語(yǔ)言,但后來(lái)加入了很多動(dòng)態(tài)特性,如反射(調(diào)用)、字節(jié)碼操作(增改類)、腳本引擎(JS等)。
- OC的動(dòng)態(tài)特性,主要有動(dòng)態(tài)類型、動(dòng)態(tài)綁定(消息轉(zhuǎn)發(fā))、動(dòng)態(tài)載入。
2.5 訪問(wèn)權(quán)限
- Java的類、方法和成員變量有4種訪問(wèn)權(quán)限:public、protect、default、private。對(duì)類的封裝性和保護(hù)更好。
- OC沒(méi)有顯式的訪問(wèn)權(quán)限。不希望其它類調(diào)用,就不要聲明到.h文件,只定義到.m里。
2.6 空指針
- NP錯(cuò)誤占了Android Crash的一半左右。而OC沒(méi)這個(gè)問(wèn)題,變量定義后默認(rèn)賦值nil,這是一個(gè)空對(duì)象,在其上調(diào)用任何方法及屬性都不報(bào)錯(cuò)。
- 后者對(duì)應(yīng)用的穩(wěn)定性更好,但也有可能會(huì)導(dǎo)致隱含的邏輯錯(cuò)誤不能被發(fā)現(xiàn)。
2.7 getter & setter
- Java類私有變量,需要自行定義getter和setter方法,當(dāng)然AS提供了快捷鍵快速批量生成。
- OC則在語(yǔ)法上提供了屬性@property的定義,簡(jiǎn)化了代碼。如:
@property (nonatomic,readwrite,strong) UILabel *buttonTopLabel;
2.8 閉包
閉包簡(jiǎn)單來(lái)說(shuō),就是一段代碼的集合,可以捕捉到外部變量。
Java里的閉包是匿名內(nèi)部類,通常用于傳遞接口實(shí)現(xiàn)對(duì)象,比如監(jiān)聽(tīng)器:
mBtnRetry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { xxx; }
});
OC里的閉包是block,類似函數(shù)指針,也經(jīng)常用于監(jiān)聽(tīng)器實(shí)現(xiàn):
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { xxx; }];
無(wú)論是匿名內(nèi)部類,還是block,使用時(shí)都要考慮內(nèi)存泄漏問(wèn)題。前者是匿名內(nèi)部類生命周期過(guò)長(zhǎng)引起的,后者是循環(huán)引用問(wèn)題。
2.9 繼承和多態(tài)
Java和OC都是面向?qū)ο?,支持封裝、繼承、多態(tài)特性,但在具體使用上略有區(qū)別。
| 特性 | Java | Objective-c |
|---|---|---|
| 接口 | Yes, 名稱Interface | Yes, 名稱Protocal |
| 抽象類 | Yes,不能實(shí)現(xiàn)函數(shù),不能實(shí)例化,編譯時(shí)檢查 | No |
| 分類Category | No | Yes,可以給不是自己寫(xiě)的類添加屬性和方法 |
| 類擴(kuò)展 | No | Yes,定義在.m,保護(hù)私有屬性 |
| 多繼承 | No, 可用多接口 | No |
2.10 內(nèi)存回收機(jī)制
C++對(duì)象使用完后要主動(dòng)釋放(delete a),否則會(huì)產(chǎn)生內(nèi)存泄漏。而Java和OC大部分情況下無(wú)需考慮這個(gè)問(wèn)題。
- JVM實(shí)現(xiàn)了垃圾回收機(jī)制,自動(dòng)釋放無(wú)用對(duì)象。相應(yīng)地,對(duì)象創(chuàng)建要標(biāo)記為強(qiáng)軟弱虛4個(gè)級(jí)別,會(huì)有不同的回收策略。
- OC使用ARC自動(dòng)引用技術(shù),編譯器根據(jù)約定信息來(lái)插入釋放代碼。對(duì)象創(chuàng)建要標(biāo)記為strong、weak(assign)、copy等。
這兩種方法各有特點(diǎn):
| 特性 | 垃圾回收機(jī)制 | 引用計(jì)數(shù)機(jī)制 |
|---|---|---|
| 檢測(cè)時(shí)機(jī) | 運(yùn)行期 | 編譯期 |
| 識(shí)別循環(huán)引用 | Yes,孤島檢測(cè) | No |
| 性能 | 略低,GC頻繁會(huì)影響性能 | 性能好 |
2.11 類加載機(jī)制
3. Kotlin & Swift
我就是一片空白。
4. 系統(tǒng)機(jī)制
4.1系統(tǒng)架構(gòu)
Android是基于Linux內(nèi)核,iOS是基于UNIX內(nèi)核。
圖如:Android系統(tǒng)是四層架構(gòu),高到低分別是:
- 應(yīng)用程序?qū)樱ˋpplications):即App
- 應(yīng)用程序框架層(Application Framework):包括四大組件管理、窗口管理、包管理、電話管理、位置管理等
- 系統(tǒng)運(yùn)行庫(kù)層 (Libraries and Android runtime):包括系統(tǒng)庫(kù)如Surface Manager、Media Framework、SQLite、OpenGL等,Android運(yùn)行時(shí)庫(kù)、Dalvik虛擬機(jī)也在這里。
- linux核心層 (Linux Kernel)

圖如:iOS系統(tǒng)也是四層架構(gòu),高到低分別是:
- 可觸摸層(Cocoa Touch layer):各種UI組件、觸屏事件處理等。
- 媒體層(Media layer):提供了圖片,音樂(lè),影片等多媒體功能。
- 核心服務(wù)層(Core Services layer):包括Foundation.Framework和Core Foundation.Framework,是基礎(chǔ)類庫(kù),如字符串、日歷、時(shí)間等。
- 核心操作系統(tǒng)層(Core OS layer):即系統(tǒng)內(nèi)核,包括驅(qū)動(dòng)、內(nèi)存管理、線程管理、文件系統(tǒng)、網(wǎng)絡(luò)等

4.2 運(yùn)行機(jī)制
- Android是通過(guò)Dalvik虛擬機(jī)來(lái)啟動(dòng)程序的,它主要負(fù)責(zé)完成對(duì)象生命周期管理、堆棧管理、線程管理、安全和異常管理,以及垃圾回收等。
- iOS使用開(kāi)源庫(kù)dyld來(lái)運(yùn)行程序,而線程管理、內(nèi)存管理等都在Core OS layer。
| 特性 | Android | iOS |
|---|---|---|
| 多進(jìn)程 | Yes | No |
| 后臺(tái)運(yùn)行 | Yes | No |
| 數(shù)據(jù)存儲(chǔ) | ram私有目錄 sd卡私有目錄 sd卡公共目錄 |
沙盒 keyChain |
| 消息推送 | 應(yīng)用層實(shí)現(xiàn) app死掉則不能接收消息 無(wú)需用戶授權(quán) |
系統(tǒng)層實(shí)現(xiàn),含本地推送和APNS app死掉還可以接收消息 需用戶授權(quán) |
| 內(nèi)容分享 | 系統(tǒng)Intent實(shí)現(xiàn) | 接Sdk,如FB、twitter等 |
4.3 安全機(jī)制、權(quán)限校驗(yàn):
Android和iOS的安全機(jī)制都有以下特性:
- 進(jìn)程沙箱隔離機(jī)制:每個(gè)App都運(yùn)行在獨(dú)立的沙盒里。
- 應(yīng)用程序簽名機(jī)制:防止惡意軟件替換安裝的應(yīng)用。
- 權(quán)限聲明機(jī)制:
- 訪問(wèn)控制機(jī)制: