日々精進

新しく学んだことを書き留めていきます

initメソッド内でviewにアクセスすると無限ループになることがある

以下のようにloadViewを定義していて、かつ
initメソッド内でself.viewにアクセスしている場合、
無限ループになる。

- (void)loadView {
    [super setView:self.tempView];
    self.tempView = nil;
}

- (id)initWithView:(GMGridView *)view{
    self = [super initWithView:view];
    if (self){
        [self registGesture];
        self.tempView = view;
    }
    return self;
}

- (void)registGesture{
    if (!isGestureRegisted){
        UIPinchGestureRecognizer *recognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureUpdated:)];
        [self.view addGestureRecognizer:recognizer];
        isGestureRegisted = YES;
    }
}

理由はloadViewメソッド内でviewにインスタンスを渡そうとしているが、viewに代入するtempViewは
self.tempView = view;
が実行された後でないとnilであるため。
そもそもinitの中でviewにアクセスしてはいけない。
viewの設定はviewDidLoad内でやるべき。
参考:http://stackoverflow.com/questions/4986098/viewdidload-infinite-loop-issue-ios