Android与iOS开发比较--基础篇

章节

上--基础篇

  1. 开发工具
  2. 开发语言
  3. Kotlin & Swift
  4. 系统机制

中--实战篇

  1. 工程文件结构
  2. 界面绘制
  3. 数据存储与传递
  4. 多线程与同步

1. 开发工具

  • Android使用Android Studio开发套件,基于IntelliJ IDEA,具有强大的文件编辑功能。自带的模拟器不好用,需要搭配Gynemotion模拟器。
  • iOS主要使用XCode开发,可以搭配AppCode做文件编辑器。
功能特性 Android Studio XCode
查看类或方法的引用处 Yes,方便 Yes,略麻烦
查看类的继承关系 Yes No
全局搜索支持正则 Yes No
log查看 方便,支持tag过滤 不方便
文件编辑易用性 Yes No
模拟器 启动慢,不好用 启动快
手机调试-缓存文件 容易抓取缓存文件 需要破解
支付调试 简单、可靠 复杂、不可靠

2. 开发语言

  • Android主要使用Java开发,是静态语言,语法和主流语言比较类似。
  • iOS主要使用Objective-c(后边用OC代称)开发,是动态语言,语法使用上有个性。

2.1 点语法和中括号

Java的方法调用这样:
String s2 = s1.replace(“abc”,”xyz”);

OC的方法调用这样:
NSString *s2 = [s1 stringByReplacingOccurrencesOfString:@"abc" withString:@"xyz"];

2.2 命名空间

  • Java类有包路径,一般不会出现类名重复冲突。
  • OC类没有命名空间,通常都加2个大写字母的类名全缀,并且OC推崇完整拼写的长类名和方法名。

2.3 函数定义

Java没有头文件。函数定义形如:
@Override
public void logThrowable(String eventName, Throwable throwable) { xxx }

OC有头文件。函数声明形如:
-(void)achievementToCommentWithAlbumId:(NSString *)albumId
MusicId:(NSString *)musicId
index:(NSString *)index
adverId:(NSString *)adverId;

  • 为了提高函数调用效率,Java虚拟机为每个类建立了一个函数表。调用时,根据方法签名(函数名+参数列表)查找。编译期会检查方法是否存在,不能调用不存在的方法。
  • OC的方法调用,其本质是消息转发。Runtime会转换成objc_msgSend(self, _cmd)。因此可以调用编译期不存在的方法。消息机制也是OC动态特性的本质,可以运行时增删改类和函数。

2.4 静态语言 & 动态语言

  • 动态类型语言:指在运行期间才去做数据类型检查,也就是说,用动态语言编程时,永远不用去给任何变量去指定数据类型。该语言会在你第一次给该变量赋值的时候,在内部把数据类型记录下来。如ruby、Python、OC等。
  • 静态类型语言:指在编译期间就去做数据类型检查,编译器必须知道所有类和函数的所有信息,也就是说在编码时要声明数据类型。如Java和c、c++、swift等。
  • Java是静态语言,但后来加入了很多动态特性,如反射(调用)、字节码操作(增改类)、脚本引擎(JS等)。
  • OC的动态特性,主要有动态类型、动态绑定(消息转发)、动态载入。

2.5 访问权限

  • Java的类、方法和成员变量有4种访问权限:public、protect、default、private。对类的封装性和保护更好。
  • OC没有显式的访问权限。不希望其它类调用,就不要声明到.h文件,只定义到.m里。

2.6 空指针

  • NP错误占了Android Crash的一半左右。而OC没这个问题,变量定义后默认赋值nil,这是一个空对象,在其上调用任何方法及属性都不报错。
  • 后者对应用的稳定性更好,但也有可能会导致隐含的逻辑错误不能被发现。

2.7 getter & setter

  • Java类私有变量,需要自行定义getter和setter方法,当然AS提供了快捷键快速批量生成。
  • OC则在语法上提供了属性@property的定义,简化了代码。如:
    @property (nonatomic,readwrite,strong) UILabel *buttonTopLabel;

2.8 闭包

闭包简单来说,就是一段代码的集合,可以捕捉到外部变量。

Java里的闭包是匿名内部类,通常用于传递接口实现对象,比如监听器:
mBtnRetry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { xxx; }
});

OC里的闭包是block,类似函数指针,也经常用于监听器实现:
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { xxx; }];

无论是匿名内部类,还是block,使用时都要考虑内存泄漏问题。前者是匿名内部类生命周期过长引起的,后者是循环引用问题。

2.9 继承和多态

Java和OC都是面向对象,支持封装、继承、多态特性,但在具体使用上略有区别。

特性 Java Objective-c
接口 Yes, 名称Interface Yes, 名称Protocal
抽象类 Yes,不能实现函数,不能实例化,编译时检查 No
分类Category No Yes,可以给不是自己写的类添加属性和方法
类扩展 No Yes,定义在.m,保护私有属性
多继承 No, 可用多接口 No

2.10 内存回收机制

C++对象使用完后要主动释放(delete a),否则会产生内存泄漏。而Java和OC大部分情况下无需考虑这个问题。

  • JVM实现了垃圾回收机制,自动释放无用对象。相应地,对象创建要标记为强软弱虚4个级别,会有不同的回收策略。
  • OC使用ARC自动引用技术,编译器根据约定信息来插入释放代码。对象创建要标记为strong、weak(assign)、copy等。

这两种方法各有特点:

特性 垃圾回收机制 引用计数机制
检测时机 运行期 编译期
识别循环引用 Yes,孤岛检测 No
性能 略低,GC频繁会影响性能 性能好

2.11 类加载机制

3. Kotlin & Swift

我就是一片空白。

4. 系统机制

4.1系统架构

Android是基于Linux内核,iOS是基于UNIX内核。

Android系统是四层架构,高到低分别是:

  • 应用程序层(Applications):即App
  • 应用程序框架层(Application Framework):包括四大组件管理、窗口管理、包管理、电话管理、位置管理等
  • 系统运行库层 (Libraries and Android runtime):包括系统库如Surface Manager、Media Framework、SQLite、OpenGL等,Android运行时库、Dalvik虚拟机也在这里。
  • linux核心层 (Linux Kernel)

图如:
Android系统架构图

iOS系统也是四层架构,高到低分别是:

  • 可触摸层(Cocoa Touch layer):各种UI组件、触屏事件处理等。
  • 媒体层(Media layer):提供了图片,音乐,影片等多媒体功能。
  • 核心服务层(Core Services layer):包括Foundation.Framework和Core Foundation.Framework,是基础类库,如字符串、日历、时间等。
  • 核心操作系统层(Core OS layer):即系统内核,包括驱动、内存管理、线程管理、文件系统、网络等

图如:

4.2 运行机制

  • Android是通过Dalvik虚拟机来启动程序的,它主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。
  • iOS使用开源库dyld来运行程序,而线程管理、内存管理等都在Core OS layer。
特性 Android iOS
多进程 Yes No
后台运行 Yes No
数据存储 ram私有目录
sd卡私有目录
sd卡公共目录
沙盒
keyChain
消息推送 应用层实现
app死掉则不能接收消息
无需用户授权
系统层实现,含本地推送和APNS
app死掉还可以接收消息
需用户授权
内容分享 系统Intent实现 接Sdk,如FB、twitter等

4.3 安全机制、权限校验:

Android和iOS的安全机制都有以下特性:

  • 进程沙箱隔离机制:每个App都运行在独立的沙盒里。
  • 应用程序签名机制:防止恶意软件替换安装的应用。
  • 权限声明机制:
  • 访问控制机制:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,101评论 1 32
  • 前言:面试笔试都是必考语法知识点。请认真复习和深入研究OC。 目录:iOS-面试题-OC基础篇 (1) - (84...
    麦穗0615阅读 4,260评论 0 33
  • 周末在言君姐姐家玩,顺手给她的彩虹糖宝贝拍了一组照片,小可爱快把我萌化了!!!小家伙特有主见,总是语出惊人,我问她...
    简糯阅读 260评论 0 0
  • tomcat服务器把http请求信息封装到HttpServletRequest对象中。开发者通过HttpServl...
    小小机器人阅读 543评论 0 0
  • 一、学习与实践 1.付出不亚于任何人的努力 2.要谦虚,不要骄傲 3.要每天反省 4.活着,就要感谢 5.积善行,...
    蓝晓霁阅读 147评论 0 0