Android與iOS開(kāi)發(fā)比較--基礎(chǔ)篇

章節(jié)

上--基礎(chǔ)篇

  1. 開(kāi)發(fā)工具
  2. 開(kāi)發(fā)語(yǔ)言
  3. Kotlin & Swift
  4. 系統(tǒng)機(jī)制

中--實(shí)戰(zhàn)篇

  1. 工程文件結(jié)構(gòu)
  2. 界面繪制
  3. 數(shù)據(jù)存儲(chǔ)與傳遞
  4. 多線程與同步

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)

圖如:
Android系統(tǒng)架構(gòu)圖

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ī)制:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,697評(píng)論 1 32
  • 周末在言君姐姐家玩,順手給她的彩虹糖寶貝拍了一組照片,小可愛(ài)快把我萌化了?。?!小家伙特有主見(jiàn),總是語(yǔ)出驚人,我問(wèn)她...
    簡(jiǎn)糯閱讀 324評(píng)論 0 0
  • tomcat服務(wù)器把http請(qǐng)求信息封裝到HttpServletRequest對(duì)象中。開(kāi)發(fā)者通過(guò)HttpServl...
    小小機(jī)器人閱讀 599評(píng)論 0 0
  • 一、學(xué)習(xí)與實(shí)踐 1.付出不亞于任何人的努力 2.要謙虛,不要驕傲 3.要每天反省 4.活著,就要感謝 5.積善行,...
    藍(lán)曉霽閱讀 166評(píng)論 0 0
  • 《論語(yǔ)》詳解:給所有曲解孔子的人(25)作者:纏中說(shuō)禪 子曰:為政以德譬,如北辰居其所而眾星共之。 詳解:通常的斷...
    故壘千堆雪閱讀 1,075評(píng)論 0 3

友情鏈接更多精彩內(nèi)容