UIIMageView,警告:check_safe_call:无法恢复当前帧

时间:2010-06-03 08:21:37

标签: iphone memory memory-management memory-leaks uiimageview

我正在基于加速度计输入更改UIImageView中的图像。图像存储在一个数组中。 应用程序运行良好一段时间然后崩溃。

  

警告:check_safe_call:无法恢复当前帧

  1. 填充数组时,我没有使用“UIImage ImageNamed”方法。
  2. 所有图像的总大小约为12 Mb。但是单个图像非常轻(<100 kb),我一次只使用一个图像。
  3. 如果有任何自动释放,我已经在视图中分配了一个NSAutoreleasePool,并在didReceiveMemoryWarning方法中将其耗尽(在应用程序崩溃之前它会被调用2,3次。)。
  4. 以下是创建图像数组的代码:

        //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

1 个答案:

答案 0 :(得分:2)

NSAutoreleasePool应该以相同的方法分配和发布。将它分配到一个地方并在另一个地方发布它通常非常糟糕(但是你粘贴的示例代码却正确地使用了它)

将图像加载到内存解压缩它们;一个100KB的压缩PNG很容易就可以解压缩2MB。

您似乎还有一个额外的retain调用,不应该在那里:[viewController.imagesArray retain];(我假设imagesArray属性标记为copyretain而不是{ {1}})