zoukankan      html  css  js  c++  java
  • cocoa应用程序生命周期

     

    分类: Mac OSX开发2013-05-18 10:05 25人阅读 评论(0) 收藏 举报

    所有的cocoa应用程序都会有一个而且仅有一个NSApplication的对象,这个对象负责程序运行过程中所有的事件获取,以及分发到对应的接受对象来处理。

    Mac OS X下应用程序启动时,首先会找到入口函数int main(int argc, char *argv[]),如果程序中没有这个函数,编译连接时会报错

    Undefined symbols:

    "_main", referenced from:

    在main函数除了做一些全局的初始化和定义以外,main函数的结尾必须要调用函数NSApplicationMain(argc, (const char **) argv);这个函数会依次完成三件事:

    // NSApplicationMain伪代码

    void NSApplicationMain(int argc, char*argv[]) {

       [NSApplication sharedApplication];

       [NSBundle loadNibNamed:@"myMain" owner:NSApp];

       [NSApp run];

    }

    1.     创建应用程序的全局实例对象NSApp。

    (1).  首先调用sharedApplication函数,如果已经存在了一个该应用程序的NSApp对象,直接返回,如果不存在,则创建一个,主要是完成与window server的连接,和一些初始化工程。

    (2).  NSApp对象在该程序运行的整个过程中都只能存在一个,保证了程序运行的唯一性。

    (3).  NSApp是从windowserver中获取事件消息以及处理事件消息的唯一途径。

    2.     加载应用程序的main nib文件到内存中。

    (1).  先找到程序中的xxx-Info.plist文件。

    (2).  找到项Main nibfile base name对应的值。

    (3).  根据(2)中的值,找到程序包中的nib文件进行加载。

    3.     执行run函数,开始事件循环。

    NSApp run 其实就是一个while循环,通过方法nextEventMatchingMask:untilDate:inMode:dequeue:依据先进先出的原则从消息队列中取出最前面的消息,然后分发到相应的NSObject(一般都是NSWindow),当消息处理完成后,又会把控制权交回到run函数中,获取下一个事件,如此循环。当消息队列中没有需要处理的消息时,nextEventMatchingMask:untilDate:inMode:dequeue:函数就会处于block状态,直到新的消息来唤醒它。需要注意的是,在执行完步骤2后,首先会执行程序托管类的中函数

    -         (void)applicationDidFinishLaunching:(NSNotification*)aNotification

    如果不重写这个函数,程序执行时只会显示mainnib中的window,所以当需要显示多个窗口时,可以在这个函数中做相应的处理。

    具体流程可以参考下图。

    image.1

    4.     退出应用程序。

    退出程序可以调用[NSApp terminate:self];调用这个方法后,并不是马上就会关闭程序,首先会调用你的应用托管类中的函数applicationShouldTerminate,默认直接返回NSTerminateNow,接着就会发出NSApplicationWillTerminateNotification消息,但是也可以返回NSTerminateCancel取消退出。

    最后说一个非常奇怪的事情,在苹果开发者帮助文档中可以找到NSApplicationMain的定义如下:

    NSApplicationMain

    Called by the main function to create and run the application.

    int NSApplicationMain (

       int argc,

       const char *argv[]

    );

    在定义中是有一个int类型的返回值,但是实际运行时,这个函数没有任何的返回值,程序退出后,main函数中NSApplicationMain后面的代码也不会被执行,所以千万不能将程序清理的工作放到后面处理。以下是官方文档给出的定义:

    This method never returns a result code. Instead, it calls the exit function to exit the application and terminate the process. If you want to determine why the application exited, you should look at the result code from the exit function instead.

  • 相关阅读:
    Linux常用命令解释
    RAID 10 配置流程
    VMware workstation Windows 10虚拟机安装步骤
    yum仓库配置
    vi 常用命令
    Linux设备驱动动态插入内核与直接集成到内核方式的利弊分析
    常用的Linux命令行文本处理工具总结
    CentOS使用总结(不断更新)
    vsftpd出现“Response: 500 OOPS: cannot change directory”解决方法
    NFS共享服务挂载时出现“access denied by server while mounting”的解决方法
  • 原文地址:https://www.cnblogs.com/watchdatalearn2012620/p/3127380.html
Copyright © 2011-2022 走看看