我正在基于加速度计输入更改UIImageView中的图像。图像存储在一个数组中。 应用程序运行良好一段时间然后崩溃。
警告:check_safe_call:无法恢复当前帧
以下是创建图像数组的代码:
//create autorelease pool as we are creating many autoreleased objects
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *finalarr = [[NSMutableArray alloc] initWithCapacity:9];
NSLog(@"start loading");
for(int y = 0; y < 100; y+=10)
{
NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:10];
for(int x = 0; x < 10; x++)
{
NSString *imageName = [[NSString alloc] initWithFormat:@"0%d",y + x];
UIImage *img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"png"]];
[arr addObject:img];
[imageName release];
[img release];
}
[finalarr addObject:arr];
[arr release];
}
NSLog(@"done loading");
// Override point for customization after app launch
viewController.imagesArray = finalarr;
[finalarr release];
//retain the array of images
[viewController.imagesArray retain];
//release the aurtorelease pool to free memory taken up by objects enqued for release
[pool release];
由于应用程序运行平稳一段时间,这意味着阵列创建绝对不是问题。
在此之后,从[accelerometer didAccelerate]
调用以下方法-(BOOL)setImageForX:(int)x andY:(int)y
{
[self.imageView setImage:(UIImage*)[(NSArray*)[self.imagesArray objectAtIndex:y] objectAtIndex:x]];
return TRUE;
}
因此,唯一正在执行的代码是“UIImageView setImage”。但是这里没有创建任何对象。
如果代码似乎有任何泄漏或我做错了,请告诉我。
谢谢,
Swapnil
答案 0 :(得分:2)
NSAutoreleasePool
应该以相同的方法分配和发布。将它分配到一个地方并在另一个地方发布它通常非常糟糕(但是你粘贴的示例代码却正确地使用了它)
将图像加载到内存将解压缩它们;一个100KB的压缩PNG很容易就可以解压缩2MB。
您似乎还有一个额外的retain
调用,不应该在那里:[viewController.imagesArray retain];
(我假设imagesArray属性标记为copy
或retain
而不是{ {1}})