首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从初始VC过渡后,Cocoa App不会退出

是因为在Cocoa框架中,应用程序的生命周期由NSApplication对象管理。当应用程序启动时,NSApplication对象会创建一个主窗口,并加载初始视图控制器(Initial View Controller)。当初始视图控制器完成其任务后,它会将控制权交还给NSApplication对象,而不是直接退出应用程序。

在Cocoa App中,通常会使用NSWindowController来管理窗口和视图控制器之间的关系。当初始视图控制器完成其任务后,可以通过以下方式将控制权交还给NSApplication对象:

  1. 调用NSWindowController的close方法关闭主窗口。这将导致NSApplication对象检测到没有打开的窗口,从而触发应用程序退出的逻辑。
  2. 调用NSApplication的terminate方法显式地请求应用程序退出。

需要注意的是,Cocoa App的退出过程中会触发一系列的回调方法,开发者可以通过实现这些方法来处理一些清理工作或保存数据的操作。以下是一些常用的回调方法:

  1. applicationWillTerminate: 在应用程序即将退出时调用,可以在这里进行一些清理工作。
  2. applicationShouldTerminate: 在应用程序即将退出时调用,可以在这里询问用户是否允许退出。
  3. applicationShouldTerminateAfterLastWindowClosed: 在关闭最后一个窗口时调用,可以在这里决定是否允许应用程序退出。

总结起来,从初始VC过渡后,Cocoa App不会直接退出,而是通过关闭主窗口或显式请求退出来触发应用程序退出的逻辑。开发者可以通过实现回调方法来处理退出过程中的一些操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

浅析RunLoop原理及其应用

引言: 一个APP的启动与结束都是伴随着RunLoop循环往复的,不断的循环、不断的往复。当线程被杀掉、APP退出被系统以占用内存为由杀掉,RunLoop就消失了。...当启动一个iOS APP时主线程启动与其对应的RunLoop也已经开启。如果不杀掉APPAPP一直运行,就是因为RunLoop循环一直为开启状态保证主线程不会被摧毁。...这也是RunLoop的作用之一保证线程不退出。RunLoop在循环过程中监听事件,当前线程有任务时,唤醒当当线程去执行任务,任务执行完成以后,使当前线程进入休眠状态。...RunLoop是线程的基础架构部分, Cocoa 和 CoreFundation 都提供了RunLoop对象方便配置和管理线程的 RunLoop。...上图 input source 和 timer source 接受事件,然后在线程中处理事件都是由RunLoop推动完成。

87520

iOS插件化架构探索

动态库即动态链接库,是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用。...下面将具体介绍如何使用动态 Framework的方式实现App的插件化及动态更新: 实现思路 将 App中的某个模块的内容独立成一个动态Framework的形式,在用户想使用某个功能的时候,根据配置列表服务器上将对应的动态库文件下载到沙盒...SVPBundle: 提供了一个通过bundlePath来初始化的方法,并提供了一个load方法,沙盒中将动态库读取到bundle对象并加载,加载完成获取bundle的principalClass对象并初始化...,拿到插件模块入口; SVPBundleDownloadItem: 提供了一个通过配置信息来初始化的方法,根据配置信息里的远程地址对插件进行下载,下载成功根据配置信息里的唯一标识、版本号、动态库名称等将动态库解压到对应的目录...随着苹果开放环境的不断发展,苹果会不会给我们开发者惊喜呢,这就不得而知了。 THE END

1.1K20

Objective-C三种定时器CADisplayLink NSTimer GCD的使用

//将创建好点实例添加到RunLoop中 - (void)removeFromRunLoop:(NSRunLoop *)runloop forMode:(NSRunLoopMode)mode; //RunLoop...Connection模式 定义:NSConnectionReplyMode(Cocoa) 描述:处理NSConnection对象相关事件,系统内部使用,用户基本不会使用。...也是最适合做UI不断刷新的事件,过渡相对流畅,无卡顿感。 缺点: 由于依托于屏幕刷新频率,若果CPU不堪重负而影响了屏幕刷新,那么我们的触发事件也会受到相应影响。...如果当前runloop在处理复杂运算,则timer执行时间将会被推迟,直到复杂运算结束立即执行触发事件,之后再按照初始设置的节奏去执行。...如果不对其进行管理则VC的永远不会引用计数为零,进而造成内存泄漏。

2.1K31

NSThread官方文档

推荐在主线程去接收用户相关的事件和初始化UI。 留意在退出时的线程行为:进程只有在非分派的线程退出时才会停止。...最佳的退出线程的方法就是让它自然退出,让它达到主链路的终点。 在Libraries中保证线程安全:对于Libraries 开发者,不能只在app变成多线程时创建locks。...终止线程:推荐的终止线程的方法是让它自然的退出。虽然有killing方法,但是严重不推荐使用。如果需要中途去终止一个线程,需要设计线程去外部响应cancel或者退出消息。...其它Cocoa Locks: NSRecursiveLock对象: RecursiveLock对象定义了一个可以被同一个线程使用多次的lock,而且不会导致死锁。...Cocoa不会在非主线程上自动更新view的内容,所以你需要调用flushGraphics方法(NSGraphicsContext)当你完成drawing。

2K30

iOS RunLoop的介绍

在处理消息时,并不会退出 Run Loop 。 Run Loop 还有一个观察者 Observer 的概念,可以往 Run Loop 中加入自己的观察者以便监控 Run Loop 的运行过程。...线程执行了这个函数,就会一直处于这个函数内部 “接受消息->等待->处理” 的循环中,直到这个循环结束(比如传入 quit 的消息),函数返回。...但一个 item 被重复加入同一个 mode 时是不会有效果的。如果一个 mode 中一个 item 都没有,则 RunLoop 会直接退出,不进入循环。...,并且也不会影响到滑动操作。...因为你的代码直接抓住事件,而非让 app 正常调度这些事件,活动的计时器可能无法被触发直到你的鼠标跟踪程序退出并返回让 app 控制。 一个 RunLoop 可以用 RunLoop 对象显式的唤醒。

1.1K100

老司机带你走进Core Animation 之CADisplayLink

类比NSTimer,CADisplayLink也有一个计时器销毁的方法: -(void)invalidate; 调用这个方法,会所有runLoop中移除当前实例,这个方法可以用于不需要计时器对他进行释放前的操作...也是最适合做UI不断刷新的事件,过渡相对流畅,无卡顿感。 缺点: 由于依托于屏幕刷新频率,若果CPU不堪重负而影响了屏幕刷新,那么我们的触发事件也会受到相应影响。...如果当前runloop在处理复杂运算,则timer执行时间将会被推迟,直到复杂运算结束立即执行触发事件,之后再按照初始设置的节奏去执行。...如果不对其进行管理则VC的永远不会引用计数为零,进而造成内存泄漏。...Connection模式 定义:NSConnectionReplyMode(Cocoa) 描述:处理NSConnection对象相关事件,系统内部使用,用户基本不会使用。

1.4K20

macOS APP零到上架

一键直达沙盒:iSandBox-APP Store 0、初始化 xcode新建工程,并且run起来,会发现和iOS项目结构类似 AppDelegate:里面有App启动和终止的代理方法: - (void...= view; firstWindowC.window.contentViewController = vc; } 有一点需要注意的是,如果MainViewController的初始化不是通过...原因在于macOS 中创建 NSViewController 不会自动创建 view.View默认也不会创建layer,所以需要自定义View....App启动,图标不出现在Dock栏。...Store的提审过程,被拒了两次,第一次是因为上架的APP必须是沙盒App,所以在项目内要添加沙盒相关配置 另外一个原因,是因为macOSmojava版本,有了深色模式,所以状态栏必须要有深色模式的图标

72720

【IOS开发高级系列】Runloop专题

但一个item被重复加入同一个mode时是不会有效果的。如果一个mode中一个item都没有,则RunLoop会直接退出,不进入循环。...UIInitializationRunLoopMode: 在刚启动App时进入的第一个Mode,启动完成就不再使用。     ...对应Web开发的进一步理解:Web开发中,中间件层其实也是操作系统服务级别的,即它也是一个runloop;而对于中间件层里面的站点,则是直线处理型线程,接收到请求到响应请求结束,执行完此线程即结束了...定时源则直接传递消息给处理例程,不会立即退出run loop。         需要注意的是,尽管定时器可以产生基于时间的通知,但它并不是实时机制。...若只用一次,那么在它启动,会把它自己run loop里面移除,而循环的观察者则不会。定义观察者并把它添加到run loop,只能使用Core Fundation。

33820

iOS动画-CAAnimation使用详解

INFINITY,一直执行)repeatCount和repeatDuration可能会相互冲突,所以你只需要对其中一个指定非零值,对两个属性都设置非0值的行为没有被定义; autoreverses BOOL 动画初始值执行到最终值...,是否会反向回到初始值;(设置为YES,动画完成将以动画的形式回到初始位置) fillMode NSStrinng 决定当前对象在非动画时间端段的动画属性值,如动画开始之前和动画结束之后 1.fillMode...动画对图层都没有影响,图层依然保持初始值 kCAFillModeForwards NSString 动画结束,图层一直保持动画的最终状态 kCAFillModeBackwards NSString...CAAnimation *)anim finished:(BOOL)flag; @end 3.removedOnCompletion removedOnCompletion属性默认为YES,表示动画完成就会图层上移除...CAGroupAnimation.gif 八、过渡动画CATransition 1.过渡动画简介 属性动画只能对图层的可动画属性起作用,而过渡动画可以改变非动画属性(比如交换一段文本和图片),或者层级关系中添加或者移除图层

2.2K10

iOS学习——iOS 整体框架及类继承框架图

我们再细看官网的对Cocoa (Application) Layer的官方解释如下,说的是该层是为创建App提供了用户界面基础,响应用户事件,并且可以管理App的行为。...这其实就是Cocoa Touch Layer(触摸层,UIKit)的作用,只是官网省略了Application Layer(应用层),因为这一层主要就是app了,主要由开发人员完成。...The Cocoa (Application) layer includes technologies for building an app’s user interface, for responding...不用紧张,take easy,不会有那么多层次的,这里的isa指针指向的是元类对象(metaclass object),带有元字,证明快到头了。那元对象有啥用呢?...根类的主要方法:分配、初始化、复制 分配:alloc和allocWithZone:方法用于某内存区域中分配一个对象内存,并使对象指向其运行时的类定义。 初始化:init方法是对象初始化。

3.3K70

React-生命周期-作用 和 React-组件-CSSTransition

;SwitchTransition两个组件显示和隐藏切换时,使用该组件TransitionGroup将多个动画组件包裹在其中,一般用于列表中元素的动画;首先来看 CSSTransition, CSSTransition...状态开始介绍,CSSTransition 有三个状态:appear: 初始enter:进入exit:退出当组件 第一次加载,当组件 显示,当组件 退出,的时候会自动查找如下类名:-appear-appear-active-appear-done...通过 CSSTransition 来实现过渡效果安装 react-transition-groupnpm install react-transition-group --save安装好的库中导入 CSSTransitionimport..., 修改 App.css 添加如下类名样式:.box-exit { /* 退出动画执行之前绑定的类名 */ width: 100px; height: 100px;...unmountOnExit:如果取值为 true, 那么表示退出动画执行完毕之后删除对应的元素图片第一次加载时的状态,就是在页面刚加载的时候触发的,修改 App.css 添加第一次加载的类名:.box-appear

14850

Mac开发之 Cocoa 绑定 入门

图片来自网络 iOS开发转为Mac OSX应用开发的过程中,cocoa 绑定算是比较大的一个差异,也是OSX上比较实用的技术,cocoa 绑定让开发者节省了大量的代码,可以快速的完成一个应用开发.本文将从三个方面为新入门...score属性,初始值为0 添加Person类,并初始化score属性为0 (3)选中Main.storyboard,添加界面组件 拖入一个Label,放在视图的右侧,然后再拖入一个slider,把它放在...Label的左侧,完成,界面应用类似与下图: 添加组件 (4)给ViewController添加一个属性(Person类型) 给ViewController添加一个son属性 (5)设置绑定,我们要让...和Slider 实际项目中,更常用的方式是score值变化,更新label和slider它们的显示.下面我们通过点击鼠标来修改一下son的socre值,在ViewController中,添加下面的代码看看结果吧...到默认系统 (3)设置slider的绑定(设置slider控件的enable属性绑定),大体如下图: 绑定slider的Enabled到默认系统 启动应用,改变复选框的状态时,注意滑块的启用或禁用状态,然后退出应用并重新启动

1.8K20

macOS AppKit 的事件响应简介

会寻找对应的进程(也就是应用程序). 6.当窗口服务找到App 进程,会将事件派发到这个应用进程的runloop 7.当应用进程的runloop接收到事件,就开始了事件响应机制,从此刻,将事件将遵循...每个应用都有一种明确的机制用来确保操作系统的窗口服务中获取事件(Event).在Cocoa Application中,这种机制叫做runloop(一个NSRunLoop对象,它允许进程接收窗口服务的各种来源...另一种意义上讲,应用程序是被事件(event)驱动的: 它从runloop的事件队列中获取一个事件(NSEvent) 派发事件(NSEvent)到合适的对象(Object) 事件被处理完成,再取下一个事件...(NSEvent),直到应用退出....应用程序(NSApplication)生成的周期性事件(NSPeriodic)通常不会使用sendEvent:派发,它们是通过某个NSObject对象注册(通过调用nextEventMatchingMask

2.6K60
领券