2014年1月15日水曜日

CGImage から NSImage へと逆移行するケース

OS X v10.8 からのメモリ管理で述べたとおり,OS X でのメモリ管理モデルは手動リファレンスカウンタ→ガベージコレクタ→自動リファレンスカウンタ(ARC)と変遷してきました.

ガベージコレクタバージョンからARCバージョンへの移行時に,若干困ることが生じます.それは NSBitmapImageRep から CGImage を取り出す場合で,次のような古いコードをコンパイラにかけると「imageのメモリ管理はどないしまんねん,ぶーぶー」とコンパイラに文句を言われてしまいます.

CGImageRef バージョン.

NSURL *bitmapImageURL = [NSURL URLWithString: ___];
NSBitmapImageRep *bitmapImage = [NSBitmapImageRep imageRepWithContentsOfURL: bitmapImageURL];
if (bitmapImage) {
  CALayer *layer = [CALayer layer];
  CGImageRef image = [bitmapImage CGImage];
  layer.contents = (id)image;
  // ...
}

もちろん,コンパイラに NSBitmapImageRep で管理させるよと伝えても良いのですが,CALayer の contents プロパティが NSImage を受け取れるので,そのまま NSImage を渡してしまうほうがスマートでしょう.具体的には次のようにします.

NSImage バージョン.

NSURL *bitmapImageURL = [NSURL URLWithString: ___];
NSImage *bitmapImage = [[NSImage alloc] initWithContentsOfURL: bitmapImageURL];
if (bitmapImage) {
  CALayer *layer = [CALayer layer];
  layer.contents = bitmapImage;
  // ...
}

こちらのほうがコードが簡潔で良いかもしれません.

0 件のコメント:

コメントを投稿