Android&iOS

一 简述

同为移动客户端,Android&iOS有着许多相似的地方,客户端开发的主要工作为界面编写,数据存储,网络请求等等, 作为开发者,Android&iOS所做的工作的基本原理的差不多的,这两个的开发思维基本相通。

二 例子

给一段object-c代码,及其错误日志,试着想出出错原因及解决办法。

目标:每秒显示斐波那契数列的新一位。

思路:

计算结果并把结果利用相关view显示。

在一顿搜索后,找出关键代码如下:

已知已下代码为切换到子线程:

 dispatch_async(dispatch_get_global_queue(0, 0), 

^{      

  // 这里是执行于子线程的代码块,可以用于处理耗时操作,    类似Runnable

    }

);

以下方法用于计算斐波那契数列:

   NSString *result=[self fbAtiIndex:1000];    // result为计算结果

以下代码用于显示:

     UITextView *textview=[UITextView new];              

       textview.text=result;   //result为显示结果

组合起来为:

dispatch_async(dispatch_get_global_queue(0, 0), ^{

// 处理耗时操作的代码块...

int i=0;

UITextView *textview=[UITextView new];

while(true){

NSString *result=[self fbAtiIndex:i];

//设置结果

  [textview setText:result];

i++;

sleep(1);

}


});

很开心执行,但是数据并没有显示,而且崩溃了,得出如下错误日志:



三 异同之处


1.广播

Android&iOS都有广播这个功能,

iOS注册广播:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginComplete) name:@"loginComplete" object:nil];

同样需要解注册:

 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"loginComplete" object:nil];

2.listview复用

Android:

在RecyclerView里面,每个Item的View对象是复用的,当上拉下拉时,来回都是那几个View对象,但View对象上显示的数据在改变。所以,处理不好可能出现显示数据错乱问题。这个过程对开发者无感的,自动完成

iOS:

在iOS中listview每一行对应的对象是UITableViewCell,类似Android的view.

//查询是否有可以复用的 UITableViewCell

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: FirstLevelCell];

if (cell == nil) {

//实例化 UITableViewCell,当划出屏膜时,会回收

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: FirstLevelCell];

}

3.数据库SQLite

iOS&Android的默认数据库都是SQLite,使用方法基本一样,区别只是Java和object的语法差异。

NSString *SQL = [NSString stringWithFormat:@"UPDATE 't_User' SET icon='%@' WHERE name = '%@'",@"Icon.png",@"name_6"];

    if ([[SQLiteManager shareInstance] execSQL:SQL]) {

        NSLog(@"对应数据修改成功");

    }

4.依赖管理

为了利用别人优秀的代码,依赖管理是必不可少的,在Android上我们使用gradle,而iOS用pod

pod的依赖文件例子如下:


语法类似gradle, pod对于api,紧跟着依赖名字,版本号。

5. 图片库

对于很多应用来说,都会从网络加载显示图片,而图片相对来说消耗流量比较大,因此都会有缓存啊什么的,在这个特性上Android&iOS都是类似的。

如iOS可以用SDWebImage,缓存特性配置


Android的ImageLoader,设置缓存特性


基本用法也差不多,区别也就语法吧。

6.object-c的block,java的匿名内部类

在编程过程中,有时会写一段代码块,作为一个任务,叫给子线程执行或者稍后触发某个条件时执行,object-c和Java都有这个功能

在object-c上,这个成为block,代码块

例子:

printBlock = ^{  

NSLog(@"print:%@", str);  

}; 

这个block,即printBlock对象,可以传来传去,执行的时候:

printBlock()

在java上,可以利用匿名内部类,(其他什么类都行~~)

例子:

Runnable printRunnable=new Runnable() {

@Override

    public void run() {

  System.out.print("Runnable");

    }

};


7.垃圾自动回收

object-c:

采用引用计数,假如有对象A,有个属性count,  表示引用计数, 刚实例化出来,赋值给B实例某字段,那么count为1,假如又赋值给C实例某字段,那么count再加一,只要count不为0,就表示A实例还在使用,不回收,假如B和C实例清空了指向A实例的字段,count减到0,就可以回收了。

采用引用计数的垃圾回收无法处理循环引用问题,如A和B实例互相引用,它们的count都不为0,但除此之外没有任何对象指向它们,这时,它们无法回收,这两个对象就在空中飘和飘,不过,它们是一对,也不会孤单了.........

那么object-c采用什么方法处理这个问题呢?

我没有研究。。。



java:图遍历

图遍历肯定保证不会出现某个对象无法回收的问题,原理是,把某些对象作为根节点,开始遍历,能遍历到的就是在用的,其他就当垃圾了,清掉它们就对了,那么那些对象是作为根节点呢?

Java虚拟机将以下对象定义为 GC Roots (根节点):

Java虚拟机栈中引用的对象:比如方法里面定义这种局部变量 User user= new User();

静态属性引用的对象:比如 private static User user = new User();

常量引用的对象:比如 private static final  User user = new User();

本地方法栈中引用的对象





8.布局编写

Android的布局编写相对简单,基本是写xml文件,自动加载解析文件,自动测量,布局每个view的位置,即其XY坐标和宽高都是自动确定的,

iOS呢?

。。。。。。





iOS基本采用纯代码编写view:(手动设置XY坐标,宽高)



假如要隐藏界面中间一个view,安卓只需一句

View.setVisibility(View.GONE);

而iOS呢?

需要手动把下半部分的所有View的Y值往上移。。


9.前端交互

Android:

对于js调用Java,Android提供了WebView.addJavascriptInterface()来进行通讯,非常简单。在android:targetSdkVersion数值为17以下的设备中,js可以调用任何Java的public方法,引起了安全问题,因此在新版本中,只有含有@JavascriptInterface注解的方法才可以被js调用。

除此之外,js调用Java还有其他非常规的方法。其实,只有js能利用某种渠道传递信息给Java,给可以做很多事,包括方法调用

例如自定义通讯格式:

fun:a:b

表明这是一个方法调用,调用对象a的b方法这样子。


第一个是利用WebViewClient的shouldOverrideUrlLoading回调,采用自定义通讯格式,通过判断url来调用Java方法。

第二个是利用window.alert  (前端调用);  拿出前端传过来的信息区解析自定义格式,去调用Java方法。

第三个是 console.log  (前端调用)?   我忘记了,就是一个前端打日志的方法,Java拦截解析信息。执行想要的逻辑。


iOS:

iOS提供了JavaScriptCore框架,类似Android的WebView.addJavascriptInterface()

Android注册一个名称为xiuxingzheapp的对象给js调用如下

mWebViewController.addJavascriptInterface(siYuanJsCallJava, "xiuxingzheapp");

JavaScriptCore差不多,同样注册一个名称为xiuxingzheapp

    JSProtocolObj=[QiuYuanJSProtocolObj new];    

  //与安卓一样 都是xiuxingzheapp 名字  

   jsContext[@"xiuxingzheapp"] = JSProtocolObj;

对于js来说,同样的对象名,使用方式也是一样。

iOS同样也可以使用其它自定义通讯格式进行js调原生代码,利用window.alert 等。


10.页面数据传递

Android:

Activity,Fragment之间传递数据,一般来说,都是通过Bundle把数据序列化传给另一页面。

Bundle args = new Bundle();

args.putSerializable(ARG_PARAM_FRAGMENT_TYPE, mFragmentType);

fragment.setArguments(args);

iOS:

很简单,给页面实例赋值就可以了(xxViewController就是页面,类似Android的xxActivity

//创建页面实例

 QiuYuanMMCWKViewController *tempController = [QiuYuanMMCWKViewController showWithContro:self withUrlStr:urlString withTitle:@"我的福单"];    

// 给页面实例赋值

 tempController.navItemColor = [UIColor ccColorWithHex:0xaaaaaa];

11 命名空间

Java:

在Java里,多个代码可以组织管理在一起,例如自己可以采用命名空间:com.hello  ,在里面写一个类A.java,发布给别人用时,只需在源代码开头加上:

    import  com.hello.A

就可以使用

假如另一个人同样起一个类名A.java,但是他的命名空间为:com.love  ,就不会于自己的类A.java冲突,使用时

完全限定名就好,如:

com.hello.A.xx();

com. love .A xx();

object-c:

object-c就比较奇葩了,没有命名空间,Java引入一个类是这样:

import android.content.Context;

object-c是这样:

#import "Constant.h"

它没有Java的命名空间那样的前缀如com.hello这些,直接按照文件名字引入文件,对于Java来说,可以同时存在多个A.java,但是object-c就不能同时存在多个A.h了,那object-c是怎么做的呢?

看个例子:


嗯~~~

就是在每个类名上加统一的前缀,来表示这个代码是那个模块的,很不优雅。。。。。。


9.上传

安卓:审核简单,快速

ios:非常慢,要求严格 (ipv6,虚拟支付要走苹果支付),后台非常多bug,数据各种错乱。

10 兼容性

苹果的兼容性就是没有兼容性,假如你升级了调试设备,那就不能调试了,要升级xcode,然后xcode告诉你要升级我必须先升级系统,连环升级。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,363评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,967评论 3 119
  • 舞蹈展现了,民国初期华美的夜上海 螺丝卷的烫发,波浪纹的刘海,风韵妖娆的旗袍,灯红酒绿。是一首代入感很强的歌曲纸醉...
    武动奇迹晓瑞阅读 459评论 0 0
  • 也是今天看到他在群里发了女朋友的照片才想起来,我已经好久都没“骚扰”过他了。 跟他是高二才认识的,他是闺密的好哥们...
    顾与南笙阅读 267评论 0 0