AppKit(一):NSAppliaction类

NSAppliaction类

用于管理APP的主时间循环,与APP中所有对象使用的资源。

声明

@MainActor class NSApplication

被提及

  • Passing control from one app to another with cooperative activation
  • Choosing a Specific Appearance for Your macOS App

概览

每个APP都使用一个NSApplication对象控制主事件循环,保持对APP 窗口和菜单的跟踪,将事件分发给适当的对象(它自己或者它的一个window),设置自动释放池,接收APP级别事件的通知。一个NSAppliaction对象有一个代理(一个你指定的对象),当APP打开或关闭,隐藏或唤起,用户选择打开文件等等,都会通知代理。通过设置代理、实现代理方法,你可以自定义APP行为,而不需要子类化NSApplication.在APP的main()函数中,通过调用NSApplicationshared实例方法,可以创建一个NSApplication实例。创建application对象之后,main()函数应当加载APP的主要nib文件,并通过给application对象发送run()消息,来启动事件循环。如果是在Xcode创建的Application对象,main()函数会自动创建。Xcode创建的main()函数,开始时会调用NSApplicationMain()函数,其功能类似如下:

objectivec 复制代码
void NSApplicationMain(int argc, char *argv[]) {
    [NSApplication sharedApplication];
    [NSBundle loadNibNamed:@"myMain" owner:NSApp];
    [NSApp run];
}

shared类方法初始化显示环境,并且将你的程序连接到窗口服务器与显示服务器。NSApplication对象维护一个应用程序使用的所有NSWindow对象的列表,所以它可以检索任何应用程序的NSView对象。shared类方法也会初始化全局变量NSApp,可以用它来检索NSApplication实例。shared只会执行一次。如果调用多次,将会返回之前的对象。

单例NSApplication对象执行着将从窗口服务器接受事件,分发给适当的NSResponder的重要任务。NSApp将事件转换为NSEvent对象,然后将事件对象转发给受影响的NSWindow对象。所有键盘和鼠标事件都直接转到与事件关联的NSWindow对象。这条规则的唯一例外是,当key-down事件触发时,Command键被按下;在这种情况下,每个NSWindow都有机会响应事件。当一个窗口对象从NSApp接收到一个NSEvent对象时,它会把它分发给它的视图层次中的对象。
NSApplication还负责分派APP接收到的某些Apple事件。例如:macOS在不同时间向你的APP发送Apple事件,如APP打开或关闭。NSApplicatio安装Apple事件处理程序,通过向适当的对象发送消息来处理这些事件。你也可以用NSAppleEventManager类来注册你自己的Apple事件处理程序。在applicationWillFinishLaunching(_:)最适合做这种事情。有关如何处理事件以及如何修改默认行为的更多信息,包括在可脚本应用程序中使用Apple事件的信息,详见:How Cocoa Applications Handle Apple EventsCocoa Scripting Guide中。
NSApplication类在初始化和事件循环中设置@autorelease块,具体来说是在初始化(或者shared)和run()方法中。类似地,AppKit添加到Bundle的方法在加载nib文件时也会使用@autorelease块。这些@autorelease块在各自的NSApplicationBundle方法的作用域之外是不可访问的。通常情况下,APP要么是在事件循环运行时创建,要么是从nib文件中加载,所以通常不会有访问权限的问题。然而,如果你确实需要在main()函数本身中使用Cocoa类(而不是加载nib文件或实例化NSApplication),你应该创建一个@autorelease块来包含使用这些类的代码。

代理和通知

你可以给你的NSApplication对象指定一个代理,代理代表NSApplication对象响应某些消息。类似的消息如:application(_:openFile:),要求代理执行某个操作;applicationShouldTerminate( _ : ),由代理决定是否允许APP退出。NSApplication类将这些消息直接发送给它的代理。
NSApplication同样会给APP的默认通知中心发送通知。任何对象都可以通过发送消息addObserver( _ :selector:name:object:)到默认的通知中心(NSNotificationCenter类的一个实例)来注册接收NSApplication发出的一个或多个通知。NSApplication的代理如果实现了某些代理方法,会自动注册并接收通知。例如,NSApplication在即将完成启动应用程序和完成启动应用程序时发布通知(willFinishLaunchingNotificationdidFinishLaunchingNotification)。代理可以通过实现方法applicationWillFinishLaunching( _ :)applicationDidFinishLaunching( _ :)来响应这些通知。如果代理想知道这两个事件,就实现这两个方法,如果只需要知道APP何时加载完成,只需要实现applicationDidFinishLaunching( _ :)就可以。

系统服务

NSApplication与系统服务架构交互,通过services菜单为你的应用提供服务。

关于继承

很少有需要子类化NSApplication的情况。不像其他面向对象的库,Cocoa不需要继承NSApplication来实现自定义APP行为。而是提供很多其他方式来自定义APP。本节将讨论有可能需要子类化NSApplication的原因,和不需要子类化NSApplication的原因。

相关推荐
pe7er3 天前
macOS 应用无法打开(权限问题)解决方案
macos·mac
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧9 天前
JSP, MVC, El, JSTL, MAC
java·开发语言·mvc·mac·jsp
独泪了无痕10 天前
Mac Homebrew 安装 MySQL 指南
数据库·mysql·mac
chrisleequeen15 天前
【无标题】
conda·mac·anaconda·环境变量·export·no found
张泽泽zzz18 天前
使用VPN后 Mac出现能联网但无法访问网页的问题 <已解决>
mac
蓝丶曦月23 天前
MacM系列芯片安装 最新版本Notepad--(平替Windows系统的Notepad++)详细教程
编辑器·notepad++·mac
oushaojun21 个月前
趣谈网络协议栈,以太网基础MAC和PHY(转)
mac·tcp·linux网络·phy
上天_去_做颗惺星 EVE_BLUE1 个月前
Docker高效使用指南:从基础到实战模板
开发语言·ubuntu·docker·容器·mac·虚拟环境
WarmSword1 个月前
mac上用cursor/vscode调试root权限进程
c++·ide·vscode·macos·mac
Laughtin1 个月前
macos命令行更换终端代理的方法
macos·bash·mac