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

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

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

?





1

2

3

4

5

6

int
main(int
argc, char
* argv[])

{

    @autoreleasepool
{

        return
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

    }

}

再看Mac应用的main函数:

?





1

2

3

4

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;
中设置,比如下面的例子:

?





1

2

3

4

5

6

7

8

9

10

11

- (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是怎样工作的呢?阅读https://developer.apple.com/library/ios/documentation/windowsviews/conceptual/viewpg_iphoneos/CreatingWindows/CreatingWindows.html

下面看看Window和View以及ViewController的关系。

UIWindow只需要一个rootViewController,

对比学习UIKit和AppKit--入门级,布布扣,bubuko.com

时间: 2024-10-27 11:06:06

对比学习UIKit和AppKit--入门级的相关文章

对比学习UIKit和AppKit -- ViewController

在iOS中ViewController的基类是UIViewController:Mac中ViewController的基类是NSViewController. Mac中ViewController父类是NSViewController,子类很少,笔者就查到了NSPageController.如果应用中需要,可以Customize. iOS中有好多个ViewController,在Ref2中有介绍,其父类是UIViewController,子类包括UINavigationController.UI

[转] Java程序员学C#基本语法两个小时搞定(对比学习)

Java程序员学C#基本语法两个小时搞定(对比学习) 对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. 1.引包 using System;java用import2.构造函数和java语法相同3.析构函数  变量和类的对象都有生命周期,生命周期结束,这些变量和对象就要被撤销.  类的对象被撤销时,将自动调用析构函数.一些善后工作可放在析构函数中完成.  析构函数的名字为~类名,无返回类型,也无参数.Per

C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义(转载)

C#与Java对比学习:类型判断.类与接口继承.代码规范与编码习惯.常量定义 类型判断符号: C#:object a;  if(a is int) { }  用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 instanceof 符号判断 类与接口的继承: C#:public class MDataRow : List<MDataCell>, IDataRecord, ICustomTypeDescriptor Java:publi

深入浅出MongoDB(五)mongo语法和mysql语法对比学习

我们总是在对比中看到自己的优点和缺点,对于mongodb来说也是一样,对比学习让我们尽快的掌握关于mongodb的基础知识. mongodb与mysql命令对比 关系型数据库一般是由数据库(database).表(table).记录(record)三个层次概念组成.而非关系型数据库mongodb是由数据库(database).集合(collection).文档对象(document)三个层次组成.mongodb对于关系型数据库里的表,没有行和列的关系概念,这体现了模式的自由特点. 语法命令如下列

OC和C对比学习

1.已有C的基础,如何快速入门OC? 1)源文件对比 思考&实现1: 1)在C语言中,我们遇到不同后缀的文件有哪些? .c .o .out .h 扩展名 .h 头文件 .c c语言原文件 .cpp .cc C++语言的原文件 .m Objective-C的原文件 .mm Objective-C++的原文件 OC中常见的两种文件:.m 文件和.h文件 扩展名 原类型 .h        头文件,头文件包含的方法,属性的声明 .m        类的实现文件,参与便衣的文件,用来实现类中的声明的方法

Java程序员学C#基本语法两个小时搞定(对比学习)

对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. 1.引包 using System;java用import2.构造函数和java语法相同3.析构函数  变量和类的对象都有生命周期,生命周期结束,这些变量和对象就要被撤销.  类的对象被撤销时,将自动调用析构函数.一些善后工作可放在析构函数中完成.  析构函数的名字为~类名,无返回类型,也无参数.Person类的析构函数为~ Person().  C#中类

思科和华为交换机常用命令之对比学习

思科和华为交换机应该是网络项目中大家接触比较多的了,这两种交换机的常用 命令各有不同,本文结合网络项目中两种交换机的常用命令从对比的角度帮助大家来学习. 一. Switch#show  run 显示所有配置命令 Switch#show   ip   inter   brief   显示所有接口状态 Switch#show vlan  brief   显示所有VLAN的信息 Switch#show   version   显示版本信息 [Quidway]dis cur 显示所有配置命令 [Quid

[Swift学习]UIKit学习之滑块控件UISlider的用法

UIKit学习之滑块控件UISlider的用法 Slider: Sliders enable users to interactively modify some adjustable value in an app, such as speaker volume or screen brightness. UISlider: A UISlider object is a visual control used to select a single value from a continuous

【对比学习】koa.js、Gin与asp.net core——中间件

web框架中间件对比 编程语言都有所不同,各个语言解决同一类问题而设计的框架,确有共通之处,毕竟是解决同一类问题,面临的挑战大致相同,比如身份验证,api授权等等,鄙人对node.js,golang,.net core有所涉猎,对各自的web框架进行学习的过程中发现了确实有相似之处.下面即对node.js的koa.golang的gin与.net core的asp.net core三种不同的web后端框架的中间件做一个分析对比 Node-Koa.js 应用级中间件 //如果不写next,就不会向下