自分のデータを入力してUIImageを作成しようとしています。これまでのところ、すべてが正常に機能しています。しかし、この関数を数回呼び出そうとすると、アプリがクラッシュするまでメモリがいっぱいになるようです。VM Trackerを使用すると、ダーティメモリが最大328MBに増加し、アプリがクラッシュしたときに290MBがCGイメージメモリであることがわかりました。
ARCが有効になっているループで関数を数回呼び出します。画像はかなり大きいですが、最初の29回の反復で正常に機能するため、問題にはなりません。私の知る限り、ダーティメモリはアプリケーションで再利用する必要があります。そうですか?では、なぜそれが私の記憶をいっぱいにするのでしょうか、そしてどうすればこの問題を回避できますか?
for(int i = 0; i < 1000; ++i) {
UIImage *img = [self createDummyImage:CGSizeMake(2000, 1600)];
}
ダミーのUIImageを作成する関数:
- (UIImage*)createDummyImage:(CGSize)size
{
unsigned char *rawData = (unsigned char*)malloc(size.width*size.height*4);
// fill in rawData (logic to create checkerboard)
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host;
CGContextRef contextRef = CGBitmapContextCreate(rawData, size.width, size.height, 8, 4*size.width, colorSpaceRef, bitmapInfo);
CGImageRef imageRef = CGBitmapContextCreateImage(contextRef);
CGColorSpaceRelease(colorSpaceRef);
CGContextRelease(contextRef);
free(rawData);
UIImage *image = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return image;
}
hooleyhoopによる実用的なソリューション
関数呼び出しを自動解放プールに入れます。
for (int i = 0; i < 1000; ++i) {
@autoreleasepool {
UIImage *img = [self createDummyImage:CGSizeMake(2000, 1600)];
}
}