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的原因。

相关推荐
Mysticbinary6 天前
消息验证码(MAC)的介绍
mac·hmac·认证加密
程序员老周6668 天前
mac下载homebrew 安装和使用git
git·mac·homebrew·ssh密匙·windows转mac·mac配brew环境变量
wsdhla9 天前
如何在Windows上实现MacOS中的open命令
mac·cmd·open
布尼卡16 天前
mac brew 无法找到php7.2 如何安装php7.2
php·mac
Andy32219 天前
030 期 3个神器让你的Mac更聪明!
ios·github·mac
HiF20 天前
新的生产力工具——MacBook Pro
mac
Nu1120 天前
解决 mbp14/16 的 miniled 屏幕刺眼发黄问题
操作系统·mac
差不多程序员21 天前
工作纪实_63-Mac电脑使用brew安装软件
kafka·mac·brew
Piper蛋窝22 天前
如何在 Mac M1 Pro 上 debug Linux Kernel | 基于 Ubuntu 24 工具链和 QEMU
linux·mac