iOS 5 + iPad 1 =可用内存较少

时间:2011-10-28 09:18:07

标签: ipad memory crash memory-management ios5

我的iPad现有应用程序存在问题。它是非常复杂的应用程序,部分原生(下载,本地缓存等),部分使用Sencha Touch for UI(没有PhoneGap)。

iOS4下的iPad 1和iPad 2上的应用程序运行良好。但随着iOS 1用户公开发布iOS 5 aproblem。应用程序在几秒钟的工作后崩溃。有些人write代替78,在iOS 5下,iPad 1只有30兆内存可供使用。另一个黑盒子是UIWebView。没有人知道它的内部限制。

我有一些想法如何优化JavaScript和HTML方面。例如,我尽可能地优化了结构并减少了脚本中的内存分配。我还用DIV + background-image替换了IMG标签。但崩溃仍然存在。

以下是该问题的疯狂解决方案。

解决方案

有内存警告,但我认为,我既不会发布本地内容也不会发布任何内容。所以我决定做一些荒谬的事情 - 分配几兆字节的虚拟数组并在内存警告上释放它。这是疯了但它对我有用:我可以在开始时用简单的malloc()

分配高达100兆的RAM
// Member variable
void* dummy;

// - (void)init    
dummy = malloc(100000000L);

并在系统询问时使用free()释放它。

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

    if (dummy) {
        free(dummy);
        dummy = nil;
    }
}

这次应用程序的工作时间更长。到目前为止一切都那么好......下一步 - 让重复的记忆释放成为可能。

// Member variable
NSMutableArray* _memoryWorkaround;

// - (void)init
int chunkCount = 100;
int chunkSize = 1L * 1024L * 1024L; // 1 megabyte

_memoryWorkaround = [[NSMutableArray alloc] initWithCapacity:chunkCount];

for (int i = 0; i < chunkCount; i++)
    [_memoryWorkaround addObject:[NSValue valueWithPointer:malloc(chunkSize)]];

这是 - 分配1兆字节的100块内存。这些参数可以修改。

现在我们可以根据需要释放尽可能多的内存:

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

    if ([_memoryWorkaround count]) {
        NSValue* val = [_memoryWorkaround objectAtIndex:0];
        free([val pointerValue]);
        [_memoryWorkaround removeObject:val];
    }
}

退出免费剩余时间:

- (void)dealloc {
    if ([_memoryWorkaround count]) {
        for (NSValue* val in _memoryWorkaround)
            free([val pointerValue]);
        [_memoryWorkaround removeAllObjects];
    }
    [_memoryWorkaround release];
    [super dealloc];
}

最后要做的事情是用NSTimer逐个块将缓冲区填充回chunkCount。

我知道,似乎很疯狂。是否存在更好的解决方案?

0 个答案:

没有答案