Edited at

blocksでリソースをスコープに閉じ込める

More than 5 years have passed since last update.

Objective-cを使っていて、

なんらかの寿命をスコープに閉じ込めたい状況ってないでしょうか?

私はあります。

例えばBitmapContextなんかどうでしょうか?

    CGContextRef context = CGBitmapContextCreate(NULL,

width, height,
8,
4 * width,
colorSpace,
kCGImageAlphaPremultipliedLast);

CGContextRelease(context); /* これ忘れそう! */

こんな時、例えばこういう方法もあるかな?と思います。

- (void)scopedBitmapContextHeight:(int)height width:(int)width blocks:(void(^)(CGContextRef))blocks

{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL,
width, height,
8,
4 * width,
colorSpace,
kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
colorSpace = NULL;

if(blocks)
blocks(context);

CGContextRelease(context);
}

//使うとき

[self scopedBitmapContextHeight:100 width:100 blocks:^(CGContextRef context) {
CGPoint line[] = {{0, 0}, {100, 100}};
CGContextStrokeLineSegments(context, line, 2);

CGImageRef imageFromContext = CGBitmapContextCreateImage(context);
CGImageRelease(imageFromContext);
}];

うーん、なんか微妙な気もしますが、頭の体操ということでご勘弁を

また、例外のことはまったく考えてません