忍者ブログ

佐崎司と愉快な仲間達

ゲーム、アニメ、CG、iOS開発など思いついたことを記事にしています。 管理人が3人いますので、記事にまとまりはないと思います。 iPhoneアプリのレビュー依頼も受け付けています。

循環参照を修正する方法について

わか

iOSのブロック構文にて循環参照が発生しやすいのは有名ですが、今回循環参照に関して修正したことを簡単にまとめたいと思います。

ソース全体で循環参照を意識していなかったため、全体的に修正しました。
その際の修正方法は以下です。

・ブロック構文の検索
 NSBlockOpretion、dipatch、自分で作成したブロック構文、UIViewのanimateWithDurationなど対象は多い。
 「^(」 「^{」の2種類で全体検索するば大抵見つかるでしょう。

・ブロック構文内で「self」「外部変数」「外部オブジェクト」使用する方法
 self:__weak typeof (self) weakSelf = self;
 外部変数:変数参照であればそのままでOK。変数変更であれば、変数宣言に__blockを追加する
 外部オブジェクト:__weak MyObject *weakObj = Obj;

    __weak typeof (self) weakSelf = self;
    int num1 = 1;                           // 参照
    __block NSInteger num2 = 1; // 変更
    __weak MyObject *weakObj = Obj;
    [UIView animateWithDuration:0.3f 
                            delay:0.1f
                         options:UIViewAnimationOptionCurveEaseIn
                   animations:^{
                        __strong typeof (weakSelf) strongSelf = weakSelf;
                        if ( strongSelf != nil ) {
                            strongSelf.view.alpha = 1.0;
                        }
                         __strong MyObject *strongObj = weakObj;
                        if ( strongObj != nil ) {
                            strongObj.alpha = 1.0;
                        }
                     } completion:^(BOOL finished) {
                         if (finished == YES) {
                             // 参照だけ
                             NSLog(@"num1:%d", num1);
                             // 変更
                             num2++;
                         }
                     }];

有名なライブラリやSDKであっても循環参照は存在しました。使用する前に調べる必要がありそうです。
循環参照は発生しやすいので、プロジェクトが大きくなってからだと大変です。
ブロック構文を使用する際には常に気をつけるようにしましょう。

拍手[0回]

PR