美文网首页
Android与iOS开发比较--基础篇

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

作者: matt_chan | 来源:发表于2019-03-06 19:45 被阅读0次

    章节

    上--基础篇

    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都运行在独立的沙盒里。
    • 应用程序签名机制:防止恶意软件替换安装的应用。
    • 权限声明机制:
    • 访问控制机制:

    相关文章

      网友评论

          本文标题:Android与iOS开发比较--基础篇

          本文链接:https://www.haomeiwen.com/subject/xnzzuqtx.html