【iOS-Android开发对比】之 APP入口
[图片 Android vs iOS]
提纲
对比分析iOS,Android的入口,
iOS,Android的界面单元
为什么要有那样的生命周期
继承和抽象类怎么写,例如工厂模式
对象的强弱,iOS的特色
程序入口 (Entry Point)
#首先来看iOS应用的入口:
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
和所有C程序一样,main函数是Objective-C程序的入口。虽然这个main方法返回 int,但它并不会真正返回。它会一直存在于内存中,直到用户或者系统将其强制终止.
上面的UIApplicationMain
其来自 UIKit
,是一个非常重要的函数。
说一下参数,前两个参数大家都懂。
第三个参数,是UIApplication类名或者是其子类名,如果是nil,则默认使用UIApplication类名。
第四个参数,是AppDelegate类作为应用的委托对象,用来监听应用生命周期相关的委托方法。
这个UIApplication
的核心作用是提供了iOS程序运行期间的控制和协作工作。它创建了App的几个核心对象如: UIApplicationDelegate UIWindow, UIView,来处理一下过程:
程序入口main函数创建UIApplication实例和UIApplication代理实例。
从可用Storyboard文件加载用户界面
调用AppDelegate自定义代码来做一些初始化设置
将app放入Main Run Loop环境中来响应和处理与用户交互产生的事件
这个UIApplication对象在启动时就设置 Main Run Loop
,并且使用它来处理事件和更新基于view的界面, Main Run Loop就是应用程序的主线程。
[图片 iOS, swift, Android举牌]
说说Swift的入口:
在Swift语言当中,编译器不会再去寻找 main 函数作为程序的入口,而是一个main.swift
文件.
该文件中的第一行代码就默认为是程序的入口, 可以添加如下代码:
UIApplicationMain(C_ARGC, C_ARGV, nil,
NSStringFromClass(AppDelegate))
没错,就是之前提到的UIApplicationMain
。这里 C_ARGC, C_ARGV 全局变量 就是main函数中的
argc, argv。
另外,可以在Swift文件中添加 @UIApplicationMain
标签注明项目入口。这样做会让编译器忽略main.swift入口文件,而将标注有@UIApplicationMain标签的文件当做入口文件。
#再来看看Android的:
Android程序你找不到显式的main方法
尽管java也有main方法,可Android似乎却找不到main。
对于这个问题,有很多解释。
Stackoverflow上有解释说没有main是因为不需要main,系统生成activity并调用其方法,应用默认启动已经把main代替了,因此不需要用main方法。
那么程序的入口在哪里? 我们从Application
开始看.
每个Android程序的包中,都有一个manifest文件声明了它的组