在 ImageContext 中创建 UIImage 的自动释放
autorelease with creating UIImage in ImageContext
我正在自动释放池内绘制一个 ImageContext 以控制我的内存占用,并从自动释放池内部绘制图像 return。我在这个调用中发生了崩溃,我想知道这是否是由于调用函数使用图像之前在自动释放池中释放图像造成的。这是我的代码:
-( UIImage *) imageRepFromShapes
{
CGRect sheetDisplayView = [ UIScreen mainScreen ].bounds;
@autoreleasepool {
UIGraphicsBeginImageContextWithOptions( boundingRect_m.size, NO, 0.0 );
CGContextRef context = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(context);
for ( Shape *shape in arryOfShapes ) {
[ shape drawShape ];
}
UIGraphicsPopContext();
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
}
另一个问题是我是否需要在此调用中使用 UIGraphicsPushContext 和 UIGraphicsPopContext,它们是否在正确的位置。
我将不胜感激澄清这一点。
感谢
礼萨
将 return
移到自动释放池之外,以确保您的图像不会被丢弃。执行以下操作之一:
ARC
UIImage *image = nil;
@autoreleasepool {
// ...
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
return image;
非 ARC
UIImage *image = nil;
@autoreleasepool {
// ...
image = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();
}
return [image autorelease];
我正在自动释放池内绘制一个 ImageContext 以控制我的内存占用,并从自动释放池内部绘制图像 return。我在这个调用中发生了崩溃,我想知道这是否是由于调用函数使用图像之前在自动释放池中释放图像造成的。这是我的代码:
-( UIImage *) imageRepFromShapes
{
CGRect sheetDisplayView = [ UIScreen mainScreen ].bounds;
@autoreleasepool {
UIGraphicsBeginImageContextWithOptions( boundingRect_m.size, NO, 0.0 );
CGContextRef context = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(context);
for ( Shape *shape in arryOfShapes ) {
[ shape drawShape ];
}
UIGraphicsPopContext();
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
}
另一个问题是我是否需要在此调用中使用 UIGraphicsPushContext 和 UIGraphicsPopContext,它们是否在正确的位置。 我将不胜感激澄清这一点。 感谢
礼萨
将 return
移到自动释放池之外,以确保您的图像不会被丢弃。执行以下操作之一:
ARC
UIImage *image = nil;
@autoreleasepool {
// ...
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
return image;
非 ARC
UIImage *image = nil;
@autoreleasepool {
// ...
image = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();
}
return [image autorelease];