我注意到 NSWindowDelegate
的 文档显示:窗口委托可以实现的一组可选方法来响应事件,例如窗口大小调整、移动、暴露和最小化。
一组管理应用程序生命周期及其与通用系统服务交互的方法。
这没有“可选”一词。我发现不包括委托会减少应用程序的可执行文件大小,并且如果我在应用程序的整个生命周期中仅使用一个单个窗口似乎能够替换它:
public func applicationShouldTerminateAfterLastWindowClosed(_ _: NSApplication) -> Bool {
return true
}
在
NSWindowDelegate
中使用以下方法:
public func windowWillClose(_ _: Notification) {
NSApp.stop(nil)
}
行为看起来是一样的,但是我在任何地方都找不到任何迹象表明苹果官方支持没有
NSApplicationDelegate
。这会带来任何不可预见的后果吗?
记录,但鉴于以下事实
NSApplication.delegate
nullable
(@property (nullable, weak) id<NSApplicationDelegate> delegate
1),因此 NSApplication
可以没有委托,所有NSApplicationDelegate
@optional
²,因此委托对象不需要响应任何协议方法,并且完全可以通过从裸 Obj-C NSApplicationMain(argc, argv)
main.m
来设置和运行应用程序,无需任何其他代码/设置
- 您只是不会以这种方式获知应用程序生命周期事件。就目前而言,应用程序委托基础设施的存在是为了通知您各种事件,但并不严格依赖于您对它们的响应。
[1][2]NSApplication.h
,随 macOS SDK 一起提供,未在线公开提供,因此我没有可以直接链接到的资源。如果您正在编写 macOS 应用程序,则可以通过 ⌘ 单击此文件中找到的符号来查看此文件的内容,例如
NSApplication
、NSApplicationDelegate
、NSApplicationMain
等;或在磁盘上的 macOS SDK 路径 > System/Library/Frameworks/AppKit/Versions/Current/Headers/NSApplication.h