gpt4 book ai didi

ios - iOS后台调优后单例实例的生命周期

转载 作者:可可西里 更新时间:2023-11-01 01:21:02 24 4
gpt4 key购买 nike

我有 EventManagerReg 类单例 (Obj-C):

事件管理器

class EventManager : NSObject {

override init() {
super.init()

Reg.shared().id = myId
Reg.shared().delegate = self
}
}

Reg(单例)

@implementation Reg   

//...

+(Reg*) shared{
static dispatch_once_t once;
static Reg *manager;
dispatch_once(&once, ^ { manager = [[Reg alloc] init]; });
return manager;
}

//...
@end

所以这是我在 Controller 中的调用:

class ViewController: UIViewController {

let manager = EventManager()

override func viewDidLoad() {
super.viewDidLoad()
let a = SomeHandler.instance
}

DispatchQueue.global(qos: .default).async {

SomeHandler.instance.registerBlocks({ obj in
let m = EventManager()

}, failureBlock: { (a, b, e) in
let m = EventManager()

}, status: { (a, b, c) in

}) { value in
let m = EventManager()
}
}

当设备进入后台并返回前台时,我有时会在 10-15 秒后收到来自 SomeHandler.instance.registerBlocks 的回调

我的问题是:Reg 实例会发生什么情况?

如果应用程序始终处于事件状态,则每次调用 EventManager() 时,我都应该获得相同的 Reg 实例,因为它是单例。

但是当设备进入后台时,操作系统会释放所有实例,因此当用户再次打开应用程序时,Reg.shared() 应该返回不同的实例,是这样吗

如果 Reg.shared()实例做了一些长时间的工作,比如发送 HTTP 请求,会发生什么?

最佳答案

要进一步详细说明 Paulw11 的评论,请参阅有关应用程序 life cycle 的文档.

很多人并没有真正说明“背景”的含义:

  1. 他们只是按下主页按钮,以便在屏幕上显示主屏幕或其他一些应用
  2. 只是让设备进入休眠状态
  3. 他们前段时间做过这两个
  4. 他们使用 Xcode 终止应用程序或重新启动设备,在任务管理器中看到该应用程序(双击主页按钮),因此他们假设它处于后台模式

可能还存在“背景”的其他一些不明确的常见用法,但我想您会明白的。

正如 Paulw11 正确指出的那样,只有当应用进入“未运行”状态时,您的单例才会被释放,即它被终止。请注意,这发生在我列出的情况 4 中,但是应用程序是否在任务管理器中列出并不表示它正在运行!我之所以这么说,是因为我遇到过有人说“我的应用程序刚刚进入后台,但当我再次将其置于前台时,它似乎再次执行了我所有的启动代码!”情况 3 可能最终也会导致您的应用被终止(即它从“暂停”变为“未运行”),但不一定如此(取决于设备使用情况等)。前两种情况会导致应用首先进入后台模式(你的单例还在),然后进入挂起模式(应用不再做任何事情,但内存仍然完好无损,所以你的单例不会被重新 -稍后启动)。

最后,(真正的)单例只会在应用程序终止时被释放,其他一切都会严重误用该术语(另请注意,这里存在单例的危险)。操作系统不会随机进入您的应用程序的内存分配并带走它的东西。它所做的唯一一件事就是发送内存警告,让应用程序自行决定如何节省内存(如果它尚未暂停)。只有当它不“支配”应用程序的资源使用内存时才会被“释放”:通过完全杀死它。

@Paulw11:我不想偷你的答案,所以你为什么不从你的评论中做一个。 snaggs 然后可以接受。 :)

关于ios - iOS后台调优后单例实例的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43938252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com