泄漏在哪里? /为什么我有记忆问题?

时间:2011-03-28 15:59:44

标签: objective-c cocoa-touch ipad memory-management memory-leaks

我正在创建的iPad应用程序遇到一些麻烦。在一个点上有一个约80帧的简单图像序列/动画。

代码看起来像这样(这是一个UIView子类的子类):

- (id)init {
    UIImage *theImage = [UIImage imageNamed:@"chart0075.jpg"];

    // get the frame
    CGRect lgeFrame = CGRectMake(20, 130, theImage.size.width, theImage.size.height);

    // set the new frame
    CGFloat newHeight = theImage.size.height/1.65;
    CGFloat newWidth = theImage.size.width/1.65;

    CGRect smlFrame = CGRectMake(480, 200, newWidth, newHeight);

    self = [super initWithLargeFrame:lgeFrame smallFrame:smlFrame];
    if(self){
        // lets add the image as an image view
        theImageView = [[UIImageView alloc] initWithImage:theImage];
        [theImageView setFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
        [theImageView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
        [self addSubview:theImageView];

        // now we need to make an array of images for the image sequence
        NSMutableArray *imageSeq = [NSMutableArray array];
        for(int i = 1; i < 76; i++){
            NSString *jpgnumber;
            if(i<10){
                jpgnumber = [NSString stringWithFormat:@"000%i",i];
            }
            else {
                jpgnumber = [NSString stringWithFormat:@"00%i",i];
            }
            NSString *imageFile = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"chart%@",jpgnumber] ofType:@"jpg"];
            [imageSeq addObject:[UIImage imageWithContentsOfFile:imageFile]];
        }
        [theImageView setAnimationImages:imageSeq];
        [theImageView setAnimationDuration:1.5];
        [theImageView setAnimationRepeatCount:1];
    }

    return self;
}

然后在反向捏合手势上,图像应该是动画的。第一次执行此反向捏合手势时,需要几秒钟才能启动动画。有时我得到一个内存警告级别1,应用程序将崩溃。

问题出在这里? 80 jpgs是不是太大了,不能一次保存在内存中?他们总共不到2mb,所以他们肯定不应该填满ipad的记忆吗?

我用分配工具查看了它,这表明我在动画时有大约40kb的内存,但是在随后的动画中它会回到0。 (尽管分配工具确实让我感到困惑)。

有谁知道造成这种情况的原因是什么?如有必要,我可以发布更多代码或其他内容吗?

非常感谢:)

2 个答案:

答案 0 :(得分:1)

您的内存使用量取决于图像未压缩的大小。宽度乘以高度时间4将告诉您图像将采用的每个字节数,乘以图像数量以获得总数。

我的猜测是你处于过度记忆的边缘。

使用VMTracker仪器运行仪器以确定。你应该看看Dirty Resident记忆。

WWDC '10和WWDC '09都在仪器和内存使用分析方面都有很好的内容。

答案 1 :(得分:0)

您没有发布ImageView

[theImageView release]