2012-05-01 16 views
0

私はゲッターをこのように初期化することはできませんなぜ私は少し混乱しています:Objective Cでゲッターをこのように初期化できないのはなぜですか?

@synthesize stack = _stack; 

- (NSMutableArray *) stack 
{ 
    if (self.stack == nil) { 
     self.stack = [[NSMutableArray alloc] init]; 
    } 
    return self.stack; 
} 

私は_stackでself.stackを交換した場合、それは完全に正常に動作することを知っているが、私はしないでください私はなぜself.stackを使うことができないのか知っています。後でコード内で問題なくself.stackを使用します。

+1

getterでself.stackをスタックに使用すると、ループが発生します。 –

答えて

5

問題はライン以下である:

if (self.stack == nil) 

ですから、自分自身の内側にあなたのgetterメソッドを呼び出して、無限再帰で結果はいる

if ([self stack] == nil) 

に相当します。

- (NSMutableArray *) stack 
{ 
    if (_stack == nil) { 
     _stack = [[NSMutableArray alloc] init]; 
    } 
    return _stack; 
} 
0

self.stackは、作成しているゲッタを呼び出します。 getterメソッドの内部でself.stackを使用すると、無限ループが作成されますが、これは望ましくありません。

0

if (self.stack == nil) { 

このラインを呼び出す場合、それは正確な方法に戻り、それが無限ループを作成しています。ただ自己を取り除く。

0

何が書いたことのようなものと同等です:

- (bool) thisIsTrue 
{ 
     if ([self thisIsTrue]) 
     { 
      // 
     } 
} 

明らかに関数が作成し、オーバーして再度上自分自身を呼び出すあなたはIVAR自体に取り組むことにより、ゲッターを呼び出して削除することができます無限ループであり、クラッシュにつながります。

関連する問題