0

この方法でゲッターを初期化できない理由が少しわかりません。

@synthesize stack = _stack;

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

self.stack を _stack に置き換えれば問題なく動作することはわかっていますが、self.stack を使用できない理由がわかりません。ただし、後でコードで self.stack を問題なく使用します。

4

4 に答える 4

5

問題は次の行にあります:

if (self.stack == nil) 

これは

if ([self stack] == nil)

つまり、getterメソッドをそれ自体の内部で呼び出しているため、無限再帰が発生します。ivar自体をアドレス指定することにより、getterの呼び出しを削除できます。

- (NSMutableArray *) stack
{
    if (_stack == nil) {
        _stack = [[NSMutableArray alloc] init];
    }
    return _stack;
}
于 2012-05-01T19:44:40.510 に答える
0

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

于 2012-05-01T19:44:18.047 に答える
0

この行を呼び出すとき

if (self.stack == nil) {

正確なメソッドに戻り、無限ループが作成されます。自己を取り除くだけです。

于 2012-05-01T19:44:38.593 に答える
0

あなたが書いたものは次のようなものと同等です:

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

明らかに、関数は自分自身を何度も呼び出し、無限ループを作成し、クラッシュにつながります。

于 2012-05-01T19:48:45.977 に答える