当前位置: 首页 > news >正文

对比学习UIKit和AppKit--入门级

UIKit是用来开发iOS的应用的,AppKit是用来开发Mac应用的,在使用过程中他们很相似,可是又有很多不同之处,通过对比分析它们的几个核心对象,可以避免混淆。

UIKit和AppKit都有一个Application类,每个应用都只创建一个Application对象,分别是UIAplication和NSApplication的实例。但是创建这个对象的方式还是稍有不同,看iOS应用的main函数:

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

 再看Mac应用的main函数:

int main(int argc, const char * argv[])
{
    return NSApplicationMain(argc, argv);
}

 UIApplicationMain

This function instantiates the application object from the principal class and instantiates the delegate (if any) from the given class and sets the delegate for the application. It also sets up the main event loop, including the application’s run loop, and begins processing events. If the application’s Info.plist file specifies a main nib file to be loaded, by including the NSMainNibFile key and a valid nib file name for the value, this function loads that nib file.

NSApplicationMain

Creates the application, loads the main nib file from the application’s main bundle, and runs the application. You must call this function from the main thread of your application, and you typically call it only once from your application’s main function, which is usually generated automatically by Xcode.

概括来说,主要都是创建Application对象,set up event loop,并开始处理event。区别是iOS上可以提供自定义的UIApplication,Application delegate是在main函数中指定的。

而Mac上Application Delegate是在nib/xib 文件中指定的,而且NSApplicationMain会读取Info.plist,得到main xib文件,并加载进来,如果main xib信息不存在或者不正确,程序就无法运行。相对应的,iOS应用使用Storyboard,iOS应用可以指定一个Main storyboard,然后由UIApplicationMain自动加载,但是这不是必须,如果不指定,程序也可以启动,如果什么都不做,就显示黑屏,但Xcode会为Empty Application手动创建Window对象,这样启动后就显示空白了,但如果指定就要指定正确,否则就会无法启动了。如果不在Info.plist中指定,依然可以在Application Delegate 的 - (void)applicationDidFinishLaunching:(NSNotification *)notification; 中设置,比如下面的例子:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    XIBViewController *controller = [[XIBViewController alloc] initWithNibName:@"XIBViewController" bundle:[NSBundle mainBundle]];
    self.window.rootViewController = controller;

    return YES;
}

上面这段代码手动创建Window对象,并创建root UIViewController,这样也是可以正常显示的。

下面再说说Window对象。在Mac和iOS上,一个Application都是可以创建多个Window对象的。iOS上在任一时刻只有一个key window,key window就是最后一个被发送了makeKeyAndVisible的Window。Mac上一个Application有多个Window是很容易理解的,iOS上的多个Window是怎样工作的呢?对于大多数iOS的应用而言,都只会创建一个Window,但如果应用需要在另外一个screen上显示内容,那就可以创建一个Window。即使没有external display,iOS也是支持在一个Application中创建多个Window,只是我们的程序需要控制如何切换它们就可以了。

关于Window,在iOS中还发现一个有意思的事情,AppDelegate中实现window property时用到了auto-synthesis,auto-synthesis就是只写一个@property,编译器就自动声称@synthesize的代码,但是如果一个类conform to一个protocol,而protocol中声明了一个property,auto-synthesis 并不会自动声称@synthesize的代码,这时加一个@property或者@synthesize就可以了。

 

下面看看Window和View以及ViewController的关系。不过就不在这篇里写了。

 

Reference:

1. https://developer.apple.com/library/ios/documentation/windowsviews/conceptual/viewpg_iphoneos/CreatingWindows/CreatingWindows.html

转载于:https://www.cnblogs.com/whyandinside/p/3706494.html

相关文章:

  • SVM算法入门
  • 分布函数(连续型连续型)
  • iOS应用开发攻略(助你iOS开发中攻城拔寨)
  • 在Struts2标签s:textfield中显示正确的日期
  • sql 用户定义函数自动生成自增长ID
  • 免费的精品: Productivity Power Tools 动画演示
  • C++之solmyr小品文
  • CMake的应用(在vision studio2008中去掉 ALL_BUILD 和 ZERO_CHECK)
  • 使用sqlite保存数据返回主键
  • 码云 Gitee 新增仓库访问之 IP 白名单功能
  • CentOS 6.4 下安装vsftpd
  • python基础数据类型(1)
  • Oracle实现自增列
  • UIApplication
  • gearman简单介绍
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • javascript 总结(常用工具类的封装)
  • Laravel 中的一个后期静态绑定
  • laravel5.5 视图共享数据
  • MQ框架的比较
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • rc-form之最单纯情况
  • unity如何实现一个固定宽度的orthagraphic相机
  • vuex 学习笔记 01
  • 计算机在识别图像时“看到”了什么?
  • 悄悄地说一个bug
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 移动端 h5开发相关内容总结(三)
  • 走向全栈之MongoDB的使用
  • 你对linux中grep命令知道多少?
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #1015 : KMP算法
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (篇九)MySQL常用内置函数
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)关于pipe()的详细解析
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)人的集合论——移山之道
  • (转)我也是一只IT小小鸟
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .Net IE10 _doPostBack 未定义
  • .net反编译工具