如何制作快速填充内存的iPhone应用程序

Lop*_*ope 6 iphone memory-management

我经常尝试修复当我将iphone用于其他内存饥饿时发生的错误,它需要释放一些内存,从而从我的应用程序中卸载一些视图.我发现这很难在我需要时进行模拟,所以我决定尝试分配尽可能多的内存并强制我测试的应用程序释放未使用的视图等.

我尝试了一些简单的事情,每隔几百毫秒调用一次,但由于某些原因它没有做任何事情

[[NSData alloc] initWithBytes:malloc(2048 * 1024) length:2048 * 1024];
Run Code Online (Sandbox Code Playgroud)

仪器显示应用程序越来越大,远远超出了iphone的内存容量(分配了数百mbs),但我甚至没有得到内存警告,它根本不会影响其他应用程序.是否有某种安全措施可以防止iphone app形式做这样的事情?或者我对iphone如何工作的假设有些错误?当你面对这个问题时,你如何解决这个问题?

编辑:我在设备上运行我的应用程序,我无法在模拟器上卸载我的视图,即使我模拟内存警告(这有时工作,但很少)

EDIT2:正如bbum指出的问题确实在虚拟分配中,分配后的简单memset做了伎俩

void *data = malloc(1024 * 1024);
memset(data, 0, 1024 * 1024);
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 5

最有可能的是,背后隐藏着一些棘手的虚拟寻址。

即,一个应用程序可以自由保留最多4GB的可用32位地址空间(少于4GB,实际上是因为各种系统碎片导致碎片)。

完成后malloc(REALLYBIGNUMBER),系统将使用vm_allocate()该请求。马赫内存管理器将您的地址退回给您,但实际上并没有使用真实内存来支持它(有点像美国经济在市场上有大量的$$$,没有任何实际资产支持)。

仅当您向内存中写入(或从技术上来说)读取内容时,才会使用物理内存。而且只会逐页发生。

因此,如果您要以4096(页大小)的步幅遍历分配的缓冲区并写入一个字节,您会很快看到实际内存已被消耗。