私は次のように小さくトリミングした画像を取得するために、iPhoneに次のコードを使用しています:iPhoneのUIImageのメモリ割り当てとリリース?
- (UIImage*) getSmallImage:(UIImage*) img
{
CGSize size = img.size;
CGFloat ratio = 0;
if (size.width < size.height) {
ratio = 36/size.width;
} else {
ratio = 36/size.height;
}
CGRect rect = CGRectMake(0.0, 0.0, ratio * size.width, ratio * size.height);
UIGraphicsBeginImageContext(rect.size);
[img drawInRect:rect];
UIImage *tempImg = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();
return [tempImg autorelease];
}
- (UIImage*)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect
{
//create a context to do our clipping in
UIGraphicsBeginImageContext(rect.size);
CGContextRef currentContext = UIGraphicsGetCurrentContext();
//create a rect with the size we want to crop the image to
//the X and Y here are zero so we start at the beginning of our
//newly created context
CGFloat X = (imageToCrop.size.width - rect.size.width)/2;
CGFloat Y = (imageToCrop.size.height - rect.size.height)/2;
CGRect clippedRect = CGRectMake(X, Y, rect.size.width, rect.size.height);
//CGContextClipToRect(currentContext, clippedRect);
//create a rect equivalent to the full size of the image
//offset the rect by the X and Y we want to start the crop
//from in order to cut off anything before them
CGRect drawRect = CGRectMake(0,
0,
imageToCrop.size.width,
imageToCrop.size.height);
CGContextTranslateCTM(currentContext, 0.0, drawRect.size.height);
CGContextScaleCTM(currentContext, 1.0, -1.0);
//draw the image to our clipped context using our offset rect
//CGContextDrawImage(currentContext, drawRect, imageToCrop.CGImage);
CGImageRef tmp = CGImageCreateWithImageInRect(imageToCrop.CGImage, clippedRect);
//pull the image from our cropped context
UIImage *cropped = [UIImage imageWithCGImage:tmp];//UIGraphicsGetImageFromCurrentImageContext();
CGImageRelease(tmp);
//pop the context to get back to the default
UIGraphicsEndImageContext();
//Note: this is autoreleased*/
return cropped;
}
私は、セルの画像を更新するために、cellForRowAtIndexPathに次のコード行を使用しています:
今cell.img.image = [self imageByCropping:[self getSmallImage:[UIImage imageNamed:@"goal_image.png"]] toRect:CGRectMake(0, 0, 36, 36)];
私はこのテーブルビューを追加し、ナビゲーションコントローラからポップし、私はメモリハイキングを参照してください。私はリークは見えませんが、メモリは登り続けます。
イメージは行ごとに変更され、私は必要な時にいつでも作成または割り当てられる遅延初期化を使用してコントローラを作成しています。
私はインターネット上で同じ問題に直面している多くの人たちを見ましたが、非常にまれな良い解決策です。私は同じ方法で複数のビューを持っており、20-25回のビュー遷移の中でメモリがほぼ4MBに増加しています。
この問題を解決するには、どのような解決策がありますか?
tnx。あなたがEndImageContext前
私はそれを試みましたが、それでも問題を解決しません。私はまだメモリの増加を参照してください。 – rkb