7
+(void)setup {
    UIImage* spriteSheet = [UIImage imageNamed:@"mySpriteSheet.png"];
    CGRect rect;
    animation = [NSMutableArray arrayWithCapacity:numberOfFramesInSpriteSheet];
    int frameCount = 0;

    for (int row = 0; row < numberFrameRowsInSpriteSheet; row++) {
        for (int col = 0; col < numberFrameColsInSpriteSheet; col++) {
            frameCount++;
            if (frameCount <= numberOfFramesInSpriteSheet) {
                rect = CGRectMake(col*frameHeight, row*frameWidth, frameHeight, frameWidth);
                [animation addObject:[UIImage imageWithCGImage:CGImageCreateWithImageInRect(spriteSheet.CGImage, rect)] ];
            }
         }
    }
}

上記のコードを ARC を有効にしてコンパイルしました。imageWithCGImage:: がカウント +1 の UIImage を返し、参照が失われるため、分析ツールはメモリ リークの可能性を報告します。Leaks Instrument はメモリ リークをまったく報告しません。何が起きてる?

さらに、ARCはreleaseectを使用して手動で使用することを禁止しているため、リークをどのように修正しますか?

アドバイスを提供できる人に感謝します。

4

2 に答える 2

8

ARC は、CGImage が考慮される可能性のある C タイプを管理しません。終了したら、参照を手動で解放する必要がありますCGImageRelease(image);

+(void)setup {
    UIImage* spriteSheet = [UIImage imageNamed:@"mySpriteSheet.png"];
    CGRect rect;
    animation = [NSMutableArray arrayWithCapacity:numberOfFramesInSpriteSheet];
    int frameCount = 0;

    for (int row = 0; row < numberFrameRowsInSpriteSheet; row++) {
        for (int col = 0; col < numberFrameColsInSpriteSheet; col++) {
            frameCount++;
            if (frameCount <= numberOfFramesInSpriteSheet) {
                rect = CGRectMake(col*frameHeight, row*frameWidth, frameHeight, frameWidth);
                //store our image ref so we can release it later
                //The create rule says that any C-interface method with "create" in it's name 
                //returns a +1 foundation object, which we must release manually.
                CGImageRef image = CGImageCreateWithImageInRect(spriteSheet.CGImage, rect)
                //Create a UIImage from our ref.  It is now owned by UIImage, so we may discard it.
                [animation addObject:[UIImage imageWithCGImage:image]];
                //Discard the ref.  
                CGImageRelease(image);
            }
         }
    }
}
于 2012-09-22T02:00:34.343 に答える
3

中核となる基盤データ構造はどれも ARC で処理されません。多くの場合、これは問題を引き起こします。このような場合、メモリを手動で解放する必要があります。

于 2012-09-22T06:23:02.487 に答える