【发布时间】:2011-08-27 23:59:18
【问题描述】:
iO 在内存管理中使用非连续分配还是连续分配?假设如果用户分配超过 128 MB,App 会被关闭吗?或者内存将由 iOS 管理,就好像用户在 Deallocate 方法中分配内存并错过了释放一样?使用定义良好的数据结构分配是否可以在应用程序中使用超过 120 MB 的空间?
【问题讨论】:
标签: ios objective-c iphone memory-management
iO 在内存管理中使用非连续分配还是连续分配?假设如果用户分配超过 128 MB,App 会被关闭吗?或者内存将由 iOS 管理,就好像用户在 Deallocate 方法中分配内存并错过了释放一样?使用定义良好的数据结构分配是否可以在应用程序中使用超过 120 MB 的空间?
【问题讨论】:
标签: ios objective-c iphone memory-management
您可以使用内存
(例如,您使用 40 Mb 的 RAM,然后为 一些简短的计算)。在这种情况下,iOS 会杀死你的应用程序 立即。1
用户使用this tool测试发现的结果列表:
设备:(崩溃量/总量/占总量的百分比)2
- iPad1:127MB/256MB/49%
- iPad2:275MB/512MB/53%
- iPad3:645MB/1024MB/62%
- iPad4:585MB/1024MB/57% (iOS 8.1)
- iPad Mini 第 1 代:297MB/512MB/58%
- iPad Mini 视网膜:696MB/1024MB/68% (iOS 7.1)
- iPad Air:697MB/1024MB/68%
- iPad Air 2:1195MB/2048MB/58% (iOS 8.x)
- iPad Pro 12.9:3064MB/3981MB/77% (iOS 9.3.2)
- iPad Pro 9.7":1395MB/1971MB/71%(iOS 10.0.2 (14A456))
- iPod touch 第 4 代:130MB/256MB/51% (iOS 6.1.1)
- iPod touch 第 5 代:286MB/512MB/56% (iOS 7.0)
- iPhone4:325MB/512MB/63%
- iPhone4S:286MB/512MB/56%
- iPhone5:645MB/1024MB/62%
- iPhone5S:646MB/1024MB/63%
- iPhone6:645MB/1024MB/62% (iOS 8.x)
- iPhone6+:645MB/1024MB/62% (iOS 8.x)
- iPhone6s:1396MB/2048MB/68% (iOS 9.2)
- iPhone6s+:1195MB/2048MB/58%(理论值,未经测试)
- iPhoneSE:1395MB/2048MB/69% (iOS 9.3)
- iPhone 6s+:1392MB/2048MB/68% (iOS 10.2.1)
- iPhone 7+:2040MB/3072MB/66% (iOS 10.2.1)
- iPhone X:1392/2785/50% (iOS 11.2.1)
1https://stackoverflow.com/a/5887783/5181636
2https://stackoverflow.com/a/15200855/5181636
更多信息可以在question找到。
【讨论】:
目前 iOS 中的内存管理在没有明确的应用程序内存限制的情况下工作。 但是当 iOS 告诉你的应用程序立即释放内存或者它将被关闭时,你可以处理这种情况。
Responding to Low-Memory Warnings in iOS
128MB 对于 iOS 来说是一个相当大的内存块。如果您尝试分配超过内存限制,应用程序将在没有任何通知的情况下关闭。
【讨论】:
来自不同内存分配的块不是连续分配的(对 alloc、malloc、new 等的单独调用)。否则,它们将连续分配(来自对 malloc 的同一次调用,例如 new float[30])。根据 Apple 的说法,当您使用超过 20mb 的内存时,您的应用程序可能会因内存使用而被关闭。然而,在实践中,您可以达到大约...
如果您真的“需要”移动应用程序这么多内存,您应该真正将数据保存到临时文件并对其进行处理。一个简单的方法是使用内存映射文件。
【讨论】:
instagram 和picyou 其他应用程序一样..
在底层,iOS 使用 malloc 和朋友为每个对象分配内存,所以是的,返回的内存确实是连续的。如果您尝试分配超过可用的连续内存,malloc 调用将返回 NULL(如果未正确检查,尝试访问空指针时可能会失败)
【讨论】:
我不知道应用程序内存使用限制是否为 128 MB。但是,如果您消耗更多内存,您的应用程序将收到内存警告。如果您处理它们并清除缓存和您可以在以后创建的其他对象,您的应用程序将不会退出。如果您忽略它们,您的应用程序将退出。
【讨论】: