章节
- 开发工具
- 开发语言
- Kotlin & Swift
- 系统机制
- 工程文件结构
- 界面绘制
- 数据存储与传递
- 多线程与同步
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系统架构图Android系统是四层架构,高到低分别是:
- 应用程序层(Applications):即App
- 应用程序框架层(Application Framework):包括四大组件管理、窗口管理、包管理、电话管理、位置管理等
- 系统运行库层 (Libraries and Android runtime):包括系统库如Surface Manager、Media Framework、SQLite、OpenGL等,Android运行时库、Dalvik虚拟机也在这里。
- linux核心层 (Linux Kernel)
图如: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都运行在独立的沙盒里。
- 应用程序签名机制:防止恶意软件替换安装的应用。
- 权限声明机制:
- 访问控制机制:
网友评论