@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

= ARC retain cycle

[2012-06-06 21:05:12]

ARC retain cycleと警告されるわけですよ.

Capturing 'self' strongly in this block is likely to lead to a retain cycle

そのときのコードはこんな感じ.ブロックでself参照したり,インスタンス変数参照したりしてると怒られる.

@implementation Hoge
-(void)hogeMethod{
  hogeHandler = ^(Fuga *fuga){
    [self someMethod:fuga];
  };
}
@end

これ,selfがずっと存在するからhogeHandlerの参照が減らないのね.だから__blockつけてやると,Reference Count使わない指定ができるそうな.

訂正版

@implementation Hoge
-(void)hogeMethod{
  // ここでselfを別にコピー(こいつはブロック専用だから参照カウントを減らせてGCできる)
  __block Hoge *blockself = self;
  hogeHandler = ^(Fuga *fuga){
    [blockself someMethod:fuga];
  };
}
@end

以上.

参考にしたのはここ.
Block Retain Cycles « Borkware Miniblog