首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

AppKit(一):NSApplication类

  • 25-04-22 02:01
  • 4228
  • 9467
juejin.cn

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级别事件的通知。一个NSApplication对象有一个代理(一个你指定的对象),当APP打开或关闭,隐藏或唤起,用户选择打开文件等等,都会通知代理。通过设置代理、实现代理方法,你可以自定义APP行为,而不需要子类化NSApplication.在APP的main()函数中,通过调用NSApplication的shared实例方法,可以创建一个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 Events在Cocoa Scripting Guide中。
NSApplication类在初始化和事件循环中设置@autorelease块,具体来说是在初始化(或者shared)和run()方法中。类似地,AppKit添加到Bundle的方法在加载nib文件时也会使用@autorelease块。这些@autorelease块在各自的NSApplication和Bundle方法的作用域之外是不可访问的。通常情况下,APP要么是在事件循环运行时创建,要么是从nib文件中加载,所以通常不会有访问权限的问题。然而,如果你确实需要在main()函数本身中使用Cocoa类(而不是加载nib文件或实例化NSApplication),你应该创建一个@autorelease块来包含使用这些类的代码。

代理和通知

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

系统服务

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

关于继承

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

注:本文转载自juejin.cn的11010的文章"https://juejin.cn/post/7495365665845018664"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

141
iOS
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top