我的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。
我知道,似乎很疯狂。是否存在更好的解决方案?