在Mac上是否有相当于-applicationDidReceiveMemoryWarning :.

时间:2009-10-03 16:01:51

标签: cocoa macos memory-management

我正在寻找与iPhone上可用的-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application方法等效的方法。到目前为止,我还没有找到任何东西,但我想在开始自己编写之前检查一下。

5 个答案:

答案 0 :(得分:8)

Mac OS X上的内存与OS X Touch的功能完全不同。值得注意的是,桌面计算机拥有更多RAM,并且随着应用程序需求的增加将内存交换到磁盘。同样,有许多应用程序在争夺资源。

真正的问题是你想要完成什么?

如果答案是高效使用内存,那么您需要专注于最小化分配,确保没有泄漏,并确保优化数据结构。使用Instruments中的ObjectAlloc来分析内存使用情况并找出关注的位置。

但是,如果答案更符合我有一个缓存子系统,它可以从大量内存中受益,但我希望在其他应用程序增加其需求时将其返回给系统,然后,您需要调查Snow Leopard's Caching and Purgeable Memory支持。

值得注意的是,这两个API提供了一种积极缓存数据的方法,只要它们是系统资源,在内存压力下退回或回馈系统。

答案 1 :(得分:2)

让内核担心内存管理。

iPhone不使用虚拟内存,因此其内存限制非常具体。内核唯一的选择是在它最终终止你之前警告你。这就是iPhone有内存警告的原因。

桌面内核有更多选项可用于处理内存不足的情况,所以最好让它完成它的工作。开始积极释放已经交换到磁盘的内存对你没有好处。

答案 2 :(得分:0)

我认为你可以合理地预期大多数现代Mac将拥有至少1GB的RAM(可能是2,甚至可能是4+)。如果你的应用程序导致malloc错误和/或内存不足,那么你做错了,你需要重新考虑你在内存中存储的内容。

简而言之,没有。 Mac并不像iPhone一样受内存限制,因此不需要它。

答案 3 :(得分:0)

据我所知,没有直接的等价物。您可能会检查对象分配是否失败,然后发送通知以允许应用程序的其他部分可以监听。

在实践中,大多数应用程序都不会打扰。在您实际开始无法分配对象(虚拟内存耗尽,启动盘完全填满等)的情况下,您可能无论如何都会崩溃。

答案 4 :(得分:0)

并不完全等效,但是您可以使用GCD来监视某种内存警告。

let a = DispatchSource.makeMemoryPressureSource(
    eventMask: [.warning], queue: .main)
a.setEventHandler(handler: {
    print("memory warning!")
})
a.resume()

尽管我尚未测试此代码是否真正起作用。