ユーザがスライダを少し動かすたびに新しい画像を生成し、それをサブレイヤに追加するコードがあります。メモリをリークする以外は動作します。私は何をしてはいけないと思いますか?iPhoneカスタム画像を作成するとメモリリークが発生する
私が追加したUISlider *slider = (UISlider *)sender;
int progressAsInt = (int)(slider.value);
//add moon mask
UIGraphicsBeginImageContextWithOptions(CGSizeMake(400, 400), NO, 1);
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(contextRef, 0, 0, 0, 0.8);
CGContextSetRGBStrokeColor(contextRef, 0, 0, 0, 0.8);
int tempx = progressAsInt;
int x = tempx;
if (x < 0) {
isHigherThanHalf = YES;
x = -tempx;
}
else {
isHigherThanHalf = NO;
}
CGContextSaveGState(contextRef);
BOOL onlyDrawTopHalf = isHigherThanHalf;
CGFloat halfMultiplier = onlyDrawTopHalf ? -1.0 : 1.0;
CGRect ellipse = CGRectMake(200-x/2, 0, 0+x, 400);
CGRect clipRect = CGRectOffset(ellipse, halfMultiplier * ellipse.size.width/2, 0);
CGContextClipToRect(contextRef, clipRect);
CGContextFillEllipseInRect(contextRef, ellipse);
CGContextRestoreGState(contextRef);
CGContextSaveGState(contextRef);
onlyDrawTopHalf = !onlyDrawTopHalf;
halfMultiplier = onlyDrawTopHalf ? -1.0 : 1.0;
ellipse = CGRectMake(0, 0, 400, 400);
clipRect = CGRectOffset(ellipse, halfMultiplier * ellipse.size.width/2, 0);
CGContextClipToRect(contextRef, clipRect);
CGContextFillEllipseInRect(contextRef, ellipse);
CGContextRestoreGState(contextRef);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
NSData *data = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
//must free pixels
free(pixels);
pixels = (Byte *)[data bytes];
CGImageRef imageRef = image.CGImage;
// create a new image from the modified pixel data
size_t width = CGImageGetWidth(imageRef);
size_t height = CGImageGetHeight(imageRef);
size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef);
size_t bitsPerPixel = CGImageGetBitsPerPixel(imageRef);
size_t bytesPerRow = CGImageGetBytesPerRow(imageRef);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, [data length], NULL);
CGImageRef newImageRef = CGImageCreate (
width,
height,
bitsPerComponent,
bitsPerPixel,
bytesPerRow,
colorspace,
bitmapInfo,
provider,
NULL,
false,
kCGRenderingIntentDefault
);
// the modified image
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
sublayer2.contents = (id)[newImage CGImage];
[self.view.layer addSublayer:sublayer2];
// cleanup
[data release];
CGColorSpaceRelease(colorspace);
CGDataProviderRelease(provider);
CGImageRelease(newImageRef);
[データリリース]まだいくつかの漏れがあるように思われる。しかし、私は私が必要として、すべてを解放していと思います。
EDIT - 私は[データのリリース]に加えて、私は画像のコンテキストを閉じる必要があることを発見した UIGraphicsEndImageContext(); リークが停止しました。
好奇心の怪しさから、アナライザは何も言いませんか?製品 - >分析に進みます。 – Luke