-1

ある種のパズルを作成しようとしていますが、5〜10回シャッフルした後、メモリ警告が表示され、パズルを追加してスーパービューから削除しようとしていますが、まだ何らかのメモリ漏れがあります..誰かが私を助けてくれますか?

- (void)setup6x6
{
    int num = 0;
    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j < 6; j++)
        {
            UIImageView * imgView = [[UIImageView alloc] init];

            cor = arc4random()%4;
            nCor = arc4random()%8;
            maxCor = arc4random()%16;

            scale = _pImage.size.width / puzzleArea.frame.size.width;
            NSString * imageName1;
            UIImage * imageToMask1;
            UIImage * maskedImage1;
            if (i == 0)
            {
                if (j == 0)
                {
                    imageName1 = [topLeftCornerPuzzles objectAtIndex:cor];
                    imageToMask1 = [self cropImage:_pImage withRect:CGRectMake(0,
                                                                              58 * i * scale,
                                                                              58 * scale,
                                                                              58 * scale)];
                }
                else if (j == 5)
                {
                    imageName1 = [self checkPreviousInArray6x6:puzzles new:[topRightCornerPuzzles objectAtIndex:cor] index:num];
                    imageToMask1 = [self cropImage:_pImage withRect:CGRectMake((42 + 50*(j-1)) * scale,
                                                                              58 * i * scale,
                                                                              58 * scale,
                                                                              58 * scale)];
                }
                else
                {
                    imageName1 = [self checkPreviousInArray6x6:puzzles new:[topPuzzles objectAtIndex:nCor] index:num];
                    imageToMask1 = [self cropImage:_pImage withRect:CGRectMake((42 + 50*(j-1)) * scale,
                                                                              58 * i * scale,
                                                                              66 * scale,
                                                                              58* scale)];
                }
            }
            else if (i < 5)
            {
                if (j == 0)
                {
                    imageName1 = [self checkPreviousInArray6x6:puzzles new:[leftPuzzles objectAtIndex:nCor] index:num];
                    imageToMask1 = [self cropImage:_pImage withRect:CGRectMake(0,
                                                                              (42 + 50*(i-1)) * scale,
                                                                              58 * scale,
                                                                              66 * scale)];
                }
                else if (j == 5)
                {
                    imageName1 = [self checkPreviousInArray6x6:puzzles new:[rightPuzzles objectAtIndex:nCor] index:num];
                    imageToMask1 = [self cropImage:_pImage withRect:CGRectMake((42 + 50*(j-1)) * scale,
                                                                              (42 + 50*(i-1)) * scale,
                                                                              58 * scale,
                                                                              66 * scale)];
                }
                else
                {
                    imageName1 = [self checkPreviousInArray6x6:puzzles new:[middlePuzzles objectAtIndex:maxCor] index:num];
                    imageToMask1 = [self cropImage:_pImage withRect:CGRectMake((42 + 50*(j-1)) * scale,
                                                                              (42 + 50*(i-1)) * scale,
                                                                              66 * scale,
                                                                              66 * scale)];
                }
            }
            else
            {
                if (j == 0)
                {
                    imageName1 = [self checkPreviousInArray6x6:puzzles new:[bottomLeftCornerPuzzles objectAtIndex:cor] index:num];
                    imageToMask1 = [self cropImage:_pImage withRect:CGRectMake(0,
                                                                              (42 + 50*(i-1)) * scale,
                                                                              58 * scale,
                                                                              58 * scale)];
                }
                else if (j == 5)
                {
                    imageName1 = [self checkPreviousInArray6x6:puzzles new:[bottomRightCornerPuzzles objectAtIndex:cor] index:num];
                    imageToMask1 = [self cropImage:_pImage withRect:CGRectMake((42 + 50*(j-1)) * scale,
                                                                              (42 + 50*(i-1)) * scale,
                                                                              58 * scale,
                                                                              58 * scale)];
                }
                else
                {
                    imageName1 = [self checkPreviousInArray6x6:puzzles new:[bottomPuzzles objectAtIndex:nCor] index:num];
                    imageToMask1 = [self cropImage:_pImage withRect:CGRectMake((42 + 50*(j-1)) * scale,
                                                                              (42 + 50*(i-1)) * scale,
                                                                              66 * scale,
                                                                              58 * scale)];
                }
            }
            [puzzles addObject:imageName1];
            maskedImage1 = [self maskImage:imageToMask1 withMask:[UIImage imageNamed:imageName1]];
            [imgView setImage:maskedImage1];

            if (i == 0)
                originY = 0;
            else
                originY = 50 * (i-1) + 42;

            if (j == 0)
                originX = 0;
            else
                originX = 50 * (j-1) + 42;

            if (j == 0 || j == 5)
                sizeW = 58;
            else
                sizeW = 66;

            if (i == 0 || i == 5)
                sizeH = 58;
            else
                sizeH = 66;

            [imgView setFrame:CGRectMake(originX, originY, sizeW, sizeH)];
            [puzzleArea addSubview:imgView];
            [imgView removeFromSuperview];
            //[maskedImage1 release];
            imageToMask1 = nil;
            maskedImage1 = nil;
            [imgView release];
            [imageName1 release];
            //[imageToMask1 release];
            num += 1;
        }
    }
}

私がトリミングする方法があります:

- (UIImage *)cropImage:(UIImage *)image withRect:(CGRect)cropRect
{
    return [UIImage imageWithCGImage:CGImageCreateWithImageInRect(image.CGImage, cropRect)];
}

そして、私がマスクする方法があります:

- (UIImage *)maskImage:(UIImage *)image withMask:(UIImage *)maskImg
{
    CGImageRef maskRef = maskImg.CGImage;
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef),
                                        NULL,
                                        false);
    return [UIImage imageWithCGImage:CGImageCreateWithMask([image CGImage], mask)];
    CGImageRelease(maskRef);
    CGImageRelease(mask);
}

すべてを解放すると、メモリ警告が表示される理由がわかりません。ただし、maskedImage1 または imageToMask1 を解放しようとすると、エラーも表示されます...

4

2 に答える 2

1

を作成するたびにCGImage、リリースする必要があります。はそれUIImageを行いません。

CGImageを作成していない場合は、リリースしないでください。2 番目の方法では、 を実行しないでくださいCGImageRelease(maskRef)

メソッドからの場合return、そのステートメントの後のコードは実行されません。

- (UIImage *)cropImage:(UIImage *)image withRect:(CGRect)cropRect
{
    CGImageRef croppedCGImage = CGImageCreateWithImageInRect(image.CGImage, cropRect);
    UIImage *croppedUIImage = [UIImage imageWithCGImage:croppedCGImage];
    CGImageRelease(croppedCGImage);
    return croppedUIImage;
}

- (UIImage *)maskImage:(UIImage *)image withMask:(UIImage *)maskImg
{
    CGImageRef maskRef = maskImg.CGImage;
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef),
                                        NULL,
                                        false);
    CGImageRef maskedCGImage = CGImageCreateWithMask([image CGImage], mask);
    UIImage *maskedUIImage = [UIImage imageWithCGImage:maskedCGImage];
    CGImageRelease(maskedCGImage);
    CGImageRelease(mask);
    return maskedUIImage;
}
于 2013-07-04T19:03:23.580 に答える