NSApplication 需要 NSApplicationDelegate 吗?

问题描述 投票:0回答:1

我注意到 NSWindowDelegate

 文档如下(强调我的):

窗口委托可以实现的一组可选方法来响应事件,例如窗口大小调整、移动、暴露和最小化。

但是 NSApplicationDelegate

 文档显示:

一组管理应用程序生命周期及其与通用系统服务交互的方法。

这没有“可选”一词。我发现不包括委托会减少应用程序的可执行文件大小,并且如果我在应用程序的整个生命周期中仅使用一个单个窗口似乎能够替换它: public func applicationShouldTerminateAfterLastWindowClosed(_ _: NSApplication) -> Bool { return true }

NSWindowDelegate

中使用以下方法:

public func windowWillClose(_ _: Notification) {
    NSApp.stop(nil)
}

行为看起来是一样的,但是我在任何地方都找不到任何迹象表明苹果官方支持没有 
NSApplicationDelegate

。这会带来任何不可预见的后果吗?

    

swift macos cocoa nsapplication nsapplication-delegate
1个回答
0
投票
明确

记录,但鉴于以下事实

    NSApplication.delegate
  1. 被声明为
    nullable
    (
    @property (nullable, weak) id<NSApplicationDelegate> delegate
    1),因此
    NSApplication
    可以没有委托,
    所有
  2. NSApplicationDelegate
  3. 方法都标记为
    @optional
    ²,因此委托对象不需要响应任何协议方法,并且
    完全可以通过从裸 Obj-C 
  4. NSApplicationMain(argc, argv)
  5. 调用
    main.m
    来设置和运行应用程序,无需任何其他代码/设置
    
    
  6. 可以肯定地说,
您并不严格需要应用程序委托来编写 AppKit 应用程序

- 您只是不会以这种方式获知应用程序生命周期事件。就目前而言,应用程序委托基础设施的存在是为了通知您各种事件,但并不严格依赖于您对它们的响应。

[1][2]
NSApplication.h

,随 macOS SDK 一起提供,未在线公开提供,因此我没有可以直接链接到的资源。如果您正在编写 macOS 应用程序,则可以通过 ⌘ 单击此文件中找到的符号来查看此文件的内容,例如

NSApplication
NSApplicationDelegate
NSApplicationMain
等;或在磁盘上的 macOS SDK 路径 >
System/Library/Frameworks/AppKit/Versions/Current/Headers/NSApplication.h
    

© www.soinside.com 2019 - 2024. All rights reserved.