从 iOS 到 Android

249 阅读4分钟

前言

做了一些跨端的项目。写一篇文章算是对工作进行一下总结。从下面几个方面对 iOS 与 android 进行一下对比。

Andorid Studio vs Xcode

对于一个 iOS 的开发者,使用 android 的编辑器第一反应就是,“卧槽! 卧槽! 卧槽!,真的好方便”,开启便会自动执行引用库的更新。自动帮忙导入引用库,保存自动的代码格式化。简直是进入了全自动的时代,这才是一个合格的开发工具。

下面是一些吐槽的地方,相比较 Xcode 的 llvm 这一套编译系统,感觉 Android Studio 明显的编译时间会比较长(一个 App ),像我们的 App 每次编译都在 10 min 以上,简直让人难受到头疼。还有一个感到非常不适的是,你一个大大的运行键放在这里,竟然是打包安装,不带 Debug 功能。一般 android 同学都是通过 attatch 直接去进行 Debug。

可能这就是打包速度太慢了养成的习惯吧。并且打包速度慢的话同时还养成了另外的一个习惯,就是每次写代码都会更加认真。验证写的代码真的是太难了。

语言

由于是老的 App 并未引入新的 Swift 和 Kotolin,这次主要是对比一下 Java 和 OC,咋说呢作为一名 iOS 的开发者,我是基本可以无缝的过度到 Java 的,客观上说明了 Java 设计的还是比较人性化的。本质上 Java 与 OC 都是类 C 语言。咨询了很多写 Java 的同学,普遍都觉得 OC 的语法比较奇怪。[ ] 的调用方式,和无处不在的 @ ,<>,*。说一些使用上比较明显的区别。

java 中的 if 表达式

大家可以看下面的代码,Java 中的 if 表达式里面只能是 boolean 或者 Boolean,此处又牵扯到了另外的一个知识点,Java 中的 boolean 与 Boolean 的区别与 OC 中的 BOOL 与 bool 的区别一样吗?这个地方是不一样的,Java 中的 boolean 是基本数据类型,Boolean 是一个类的对象,不过在 Java 中这个两个可以相互转换,诸如将一个 boolean 存入字典的时候会自动进行装包,变成 Boolean 对象。但是我们应该尽量避免程序进行自动拆装包的操作。

Java 是一个静态语言,编译过程检测是非常严格的。所以 if 里面只能是 bool 表达式。

class Person {    static String personName;    String name;    int age;    boolean sex;    public void sayHellow(){        System.out.print(name);    }    static void sayPersonHellow(){        System.out.print(personName);    }}​public class MyClass {    public static void main(String[] args) {        Person person = new Person();        person.name = "123";        if(person){        }        if (person.sex){                    }    }}

java 中的 lambda 与匿名内部类

这个是经常使用的操作,比较像 iOS 中的 Block 但是一些不同。可以说是一个弱化版本的 Block 。主要区别在于,当我们给匿名内部类传递参数的时候,若该形参在内部类中需要被使用,那么该形参必须要为final。

​tv1.setOnClickListener(new OnClickListener() {              @Override             public void onClick(View v) {                  // 点击 做点啥             }         });  

java 中的类型推导

现在 andorid 版本中并不存在类型推导这个关键字,只能使用具体的类型,Java 是在 Java10 中才支持了 var。相比较而言,OC 中的 __auto 在一些长的命名上还是比较方便的。

java 中命名空间

在 iOS 的代码编写中,必须要来一个前缀,而且必须得是三个字母的前缀,否则可能面临着你的代码和系统的代码出现命名冲突的情况,设置模块间的代码都会出现命名冲突,但是 java 中引入了命名空间这个概念,就非常简单了,不用强制性的前缀,非常方便。

系统

android 整个是基于虚拟机的,这是与 iOS 完全不同的地方,低版本的 android 使用了DVM ,高版本的使用的 ART 。主要讲一下 ART,android 代码加载的是 .dex 文件。其实就是 .class 文件的优化版本。单纯的加载 .dex 文件是 JIT 的。ART 是在 .dex 文件加载之前,将其翻译为 AOT。提升执行效率。但是整体相比较 iOS 而言 还是相对很慢的。