gpt4 book ai didi

iphone - iPhone内存崩溃:信号0

转载 作者:行者123 更新时间:2023-12-03 15:57:15 24 4
gpt4 key购买 nike

我正在开发一个iPhone应用程序,该应用程序显示 map 上的一些图块。我有一个线程可以从Internet或文件系统加载图块。这是一个无尽的话题

while( true ){ //get tile into cache }

在显示了很多图块之后,不幸的是应用程序以信号0崩溃,这意味着im内存不足。

我的想法是,在这个无尽的线程中,磁贴以自动释放的方式加载,而nog自动释放。

基本上我在我无尽的线程中这样做:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
while( true ){
UIImage * img = nil;
NSFileHandle * tile = [NSFileHandle fileHandleForReadingAtPath:filePath];
if( tile ){
NSData * data = [tile readDataToEndOfFile];
if( data ){
img = [[UIImage alloc] initWithData:data];
local = YES;
}
}
if( img == nil ){
NSURL * url = [NSURL URLWithString: [NSString stringWithFormat:@"http://tile.openstreetmap.org/%@.png", todoKey ] ];
img = [[UIImage alloc] initWithData: [NSData dataWithContentsOfURL: url options:NSDataReadingMapped error:&error] ];
}

if( img != nil ){
[cache addObject:img]; //cache is an array of tiles
}

[img release];
[self cleanupCache]; //method to check if cache is full, and if so remove's objects from it
}
[pool release];

我认为autoreleasepool不会不时清理“死”引用,并且所有 slice 都保留在内存中。当我检查仪器泄漏时,没有任何内存泄漏,但是“实时内存”不断增加。

任何想法是为什么会发生这种情况以及我如何预防呢?

最佳答案

您应该交换程序的前两行:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
while( true ){
...
[pool release];
}

应该
while( true ){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
...
[pool release];
}

当前,在循环中的第一次旅行之后,您创建的NSAutoreleasePool将被释放。此后,所有自动释放的对象将被添加到调用堆栈中更高的另一个NSAutoreleasePool中。我怀疑您的程序运行时永远不会释放该父自动释放池。

关于iphone - iPhone内存崩溃:信号0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5416354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com