iOS内存分配 – 可以在应用程序中使用多less内存?

iOs是否在内存pipe理中使用不连续的或连续的分配? 假设用户分配超过128 MB,请closures应用程序吗? 或内存将由iOSpipe理,就好像用户分配内存并错过deallocate方法释放? 是否有可能在使用定义良好的数据结构分配的应用程序中使用超过120 MB?

来自不同内存分配的块不会被连续分配(单独调用alloc,malloc,new等)。 否则,它们被连续分配(从同一个调用malloc,例如new float [30])。 根据苹果公司的说法,当你使用超过20MB的内存时,你的应用程序可能会被内存使用closures。 在实践中,但是,你可以得到约…

  • iPad 2上的260 MB RAM(感谢RobCroll)
  • 总计512 Mb的设备上的RAM为170-180MB(iPhone 4,iPod touch 4g)
  • 具有256 MB内存的设备(iPad,iPhone 3gs,iPod touch 3g)上的40-80MB RAM
  • 只有128MB RAM(iPhone 3G,iPhone 2g,iPod touch 1g-2g)

如果你真的“需要”移动应用程序的这么多内存,你应该真的把数据保存到一个临时文件,然后对其进行处理。 一个简单的方法是使用内存映射文件。

您可以使用内存<您的设备RAM容量

(比如你使用40Mb的内存,然后再分配80Mb的内存用于一些简短的计算)。 在这种情况下,iOS会立即终止您的应用程序。 1

用此工具testing的用户发现的结果列表:

装置:(碰撞量/总量/总量的百分比) 2

  • iPad1:127MB / 256MB / 49%
  • iPad2:275MB / 512MB / 53%
  • iPad3:645MB / 1024MB / 62%
  • iPad4:585MB / 1024MB / 57%(iOS 8.1)
  • iPad迷你第一代: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第四代:130MB / 256MB / 51%(iOS 6.1.1)
  • iPod touch第五代: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%(iOS9.2)
  • iPhone6s +:1195MB / 2048MB / 58%(理论,未经testing)
  • 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)

1 https://stackoverflow.com/a/5887783/5181636

2 https://stackoverflow.com/a/15200855/5181636

更多的信息可以在这个问题上find。

在iOS下使用malloc和朋友为每个对象分配内存,所以是返回的内存确实是连续的。 如果你尝试分配多于可用的连续内存,malloc调用将返回NULL(如果没有正确检查,试图访问空指针时可能会失败)

目前iOS中的内存pipe理工作没有明确的应用程序内存限制。 但是当iOS告诉您的应用程序立即释放内存或者它将被closures时,您可以处理这种情况。

响应iOS中的低内存警告

对于iOS而言,128MB是相当大的内存块。 如果你将尝试分配超过内存限制的应用程序将被closures,没有任何通知。

我不知道如果应用程序内存使用限制是128 MB或不。 但是,如果你消耗更多的内存,你的应用程序会收到内存警告。 如果您处理它们并清除可以在稍后创build的caching和其他对象,则应用程序将不会退出。 如果你忽略它们,你的应用程序将退出。