章節(jié)
- 開發(fā)工具
- 開發(fā)語言
- Kotlin & Swift
- 系統(tǒng)機制
- 工程文件結(jié)構(gòu)
- 界面繪制
- 數(shù)據(jù)存儲與傳遞
- 多線程與同步
1. 開發(fā)工具
- Android使用Android Studio開發(fā)套件,基于IntelliJ IDEA,具有強大的文件編輯功能拾弃。自帶的模擬器不好用,需要搭配Gynemotion模擬器丽旅。
- iOS主要使用XCode開發(fā),可以搭配AppCode做文件編輯器纺棺。
功能特性 | Android Studio | XCode |
---|---|---|
查看類或方法的引用處 | Yes榄笙,方便 | Yes,略麻煩 |
查看類的繼承關(guān)系 | Yes | No |
全局搜索支持正則 | Yes | No |
log查看 | 方便祷蝌,支持tag過濾 | 不方便 |
文件編輯易用性 | Yes | No |
模擬器 | 啟動慢茅撞,不好用 | 啟動快 |
手機調(diào)試-緩存文件 | 容易抓取緩存文件 | 需要破解 |
支付調(diào)試 | 簡單、可靠 | 復(fù)雜巨朦、不可靠 |
2. 開發(fā)語言
- Android主要使用Java開發(fā)米丘,是靜態(tài)語言,語法和主流語言比較類似糊啡。
- iOS主要使用Objective-c(后邊用OC代稱)開發(fā)拄查,是動態(tài)語言,語法使用上有個性棚蓄。
2.1 點語法和中括號
Java的方法調(diào)用這樣:
String s2 = s1.replace(“abc”,”xyz”);
OC的方法調(diào)用這樣:
NSString *s2 = [s1 stringByReplacingOccurrencesOfString:@"abc" withString:@"xyz"];
2.2 命名空間
- Java類有包路徑堕扶,一般不會出現(xiàn)類名重復(fù)沖突。
- OC類沒有命名空間梭依,通常都加2個大寫字母的類名全綴稍算,并且OC推崇完整拼寫的長類名和方法名。
2.3 函數(shù)定義
Java沒有頭文件役拴。函數(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虛擬機為每個類建立了一個函數(shù)表扎狱。調(diào)用時侧到,根據(jù)方法簽名(函數(shù)名+參數(shù)列表)查找。編譯期會檢查方法是否存在淤击,不能調(diào)用不存在的方法匠抗。
- OC的方法調(diào)用,其本質(zhì)是消息轉(zhuǎn)發(fā)污抬。Runtime會轉(zhuǎn)換成objc_msgSend(self, _cmd)汞贸。因此可以調(diào)用編譯期不存在的方法。消息機制也是OC動態(tài)特性的本質(zhì)印机,可以運行時增刪改類和函數(shù)矢腻。
2.4 靜態(tài)語言 & 動態(tài)語言
- 動態(tài)類型語言:指在運行期間才去做數(shù)據(jù)類型檢查,也就是說射赛,用動態(tài)語言編程時多柑,永遠不用去給任何變量去指定數(shù)據(jù)類型。該語言會在你第一次給該變量賦值的時候楣责,在內(nèi)部把數(shù)據(jù)類型記錄下來竣灌。如ruby聂沙、Python、OC等初嘹。
- 靜態(tài)類型語言:指在編譯期間就去做數(shù)據(jù)類型檢查及汉,編譯器必須知道所有類和函數(shù)的所有信息,也就是說在編碼時要聲明數(shù)據(jù)類型屯烦。如Java和c坷随、c++、swift等驻龟。
- Java是靜態(tài)語言温眉,但后來加入了很多動態(tài)特性,如反射(調(diào)用)迅脐、字節(jié)碼操作(增改類)芍殖、腳本引擎(JS等)。
- OC的動態(tài)特性谴蔑,主要有動態(tài)類型豌骏、動態(tài)綁定(消息轉(zhuǎn)發(fā))、動態(tài)載入隐锭。
2.5 訪問權(quán)限
- Java的類窃躲、方法和成員變量有4種訪問權(quán)限:public、protect钦睡、default蒂窒、private。對類的封裝性和保護更好荞怒。
- OC沒有顯式的訪問權(quán)限洒琢。不希望其它類調(diào)用,就不要聲明到.h文件褐桌,只定義到.m里衰抑。
2.6 空指針
- NP錯誤占了Android Crash的一半左右。而OC沒這個問題荧嵌,變量定義后默認賦值nil呛踊,這是一個空對象,在其上調(diào)用任何方法及屬性都不報錯啦撮。
- 后者對應(yīng)用的穩(wěn)定性更好谭网,但也有可能會導(dǎo)致隱含的邏輯錯誤不能被發(fā)現(xiàn)。
2.7 getter & setter
- Java類私有變量赃春,需要自行定義getter和setter方法愉择,當(dāng)然AS提供了快捷鍵快速批量生成。
- OC則在語法上提供了屬性@property的定義,簡化了代碼薄辅。如:
@property (nonatomic,readwrite,strong) UILabel *buttonTopLabel;
2.8 閉包
閉包簡單來說要拂,就是一段代碼的集合抠璃,可以捕捉到外部變量站楚。
Java里的閉包是匿名內(nèi)部類,通常用于傳遞接口實現(xiàn)對象搏嗡,比如監(jiān)聽器:
mBtnRetry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { xxx; }
});
OC里的閉包是block窿春,類似函數(shù)指針,也經(jīng)常用于監(jiān)聽器實現(xiàn):
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { xxx; }];
無論是匿名內(nèi)部類采盒,還是block旧乞,使用時都要考慮內(nèi)存泄漏問題。前者是匿名內(nèi)部類生命周期過長引起的磅氨,后者是循環(huán)引用問題尺栖。
2.9 繼承和多態(tài)
Java和OC都是面向?qū)ο螅С址庋b烦租、繼承延赌、多態(tài)特性,但在具體使用上略有區(qū)別叉橱。
特性 | Java | Objective-c |
---|---|---|
接口 | Yes, 名稱Interface | Yes, 名稱Protocal |
抽象類 | Yes挫以,不能實現(xiàn)函數(shù),不能實例化窃祝,編譯時檢查 | No |
分類Category | No | Yes,可以給不是自己寫的類添加屬性和方法 |
類擴展 | No | Yes掐松,定義在.m,保護私有屬性 |
多繼承 | No, 可用多接口 | No |
2.10 內(nèi)存回收機制
C++對象使用完后要主動釋放(delete a)粪小,否則會產(chǎn)生內(nèi)存泄漏大磺。而Java和OC大部分情況下無需考慮這個問題。
- JVM實現(xiàn)了垃圾回收機制探膊,自動釋放無用對象杠愧。相應(yīng)地,對象創(chuàng)建要標(biāo)記為強軟弱虛4個級別突想,會有不同的回收策略殴蹄。
- OC使用ARC自動引用技術(shù),編譯器根據(jù)約定信息來插入釋放代碼猾担。對象創(chuàng)建要標(biāo)記為strong袭灯、weak(assign)、copy等绑嘹。
這兩種方法各有特點:
特性 | 垃圾回收機制 | 引用計數(shù)機制 |
---|---|---|
檢測時機 | 運行期 | 編譯期 |
識別循環(huán)引用 | Yes稽荧,孤島檢測 | No |
性能 | 略低,GC頻繁會影響性能 | 性能好 |
2.11 類加載機制
3. Kotlin & Swift
我就是一片空白工腋。
4. 系統(tǒng)機制
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)運行庫層 (Libraries and Android runtime):包括系統(tǒng)庫如Surface Manager拜马、Media Framework、SQLite沐绒、OpenGL等俩莽,Android運行時庫、Dalvik虛擬機也在這里乔遮。
- linux核心層 (Linux Kernel)
圖如:iOS系統(tǒng)也是四層架構(gòu)扮超,高到低分別是:
- 可觸摸層(Cocoa Touch layer):各種UI組件、觸屏事件處理等蹋肮。
- 媒體層(Media layer):提供了圖片出刷,音樂,影片等多媒體功能括尸。
- 核心服務(wù)層(Core Services layer):包括Foundation.Framework和Core Foundation.Framework巷蚪,是基礎(chǔ)類庫,如字符串濒翻、日歷屁柏、時間等。
- 核心操作系統(tǒng)層(Core OS layer):即系統(tǒng)內(nèi)核有送,包括驅(qū)動淌喻、內(nèi)存管理、線程管理雀摘、文件系統(tǒng)裸删、網(wǎng)絡(luò)等
4.2 運行機制
- Android是通過Dalvik虛擬機來啟動程序的,它主要負責(zé)完成對象生命周期管理阵赠、堆棧管理涯塔、線程管理、安全和異常管理清蚀,以及垃圾回收等匕荸。
- iOS使用開源庫dyld來運行程序,而線程管理枷邪、內(nèi)存管理等都在Core OS layer榛搔。
特性 | Android | iOS |
---|---|---|
多進程 | Yes | No |
后臺運行 | Yes | No |
數(shù)據(jù)存儲 | ram私有目錄 sd卡私有目錄 sd卡公共目錄 |
沙盒 keyChain |
消息推送 | 應(yīng)用層實現(xiàn) app死掉則不能接收消息 無需用戶授權(quán) |
系統(tǒng)層實現(xiàn),含本地推送和APNS app死掉還可以接收消息 需用戶授權(quán) |
內(nèi)容分享 | 系統(tǒng)Intent實現(xiàn) | 接Sdk,如FB践惑、twitter等 |
4.3 安全機制腹泌、權(quán)限校驗:
Android和iOS的安全機制都有以下特性:
- 進程沙箱隔離機制:每個App都運行在獨立的沙盒里。
- 應(yīng)用程序簽名機制:防止惡意軟件替換安裝的應(yīng)用尔觉。
- 權(quán)限聲明機制:
- 訪問控制機制: