1

次の出力が表示されるのはなぜですか。

@property (nonatomic, retain) Player *thePlayer;

次に、.mで:

NSLog(@"aPlayer retain count = %i",[aPlayer retainCount]);
thePlayer = aPlayer;
NSLog(@"thePlayer retain count = %i",[thePlayer retainCount]);

与える:

2012-09-18 21:52:36.787 Pocket Dungeons[56613:10a03] aPlayer retain count = 1
2012-09-18 21:52:36.788 Pocket Dungeons[56613:10a03] thePlayer retain count = 1
4

1 に答える 1

2

セッターを使用していません。ivar (インスタンス変数) を使用しています。宣言されたプロパティのセッターを使用するには、次の構文を使用します。

self.thePlayer = aPlayer;

これは次と同等です:

[self setThePlayer:aPlayer];

しかし、所有者オブジェクト (この場合はself) への参照がない場合、インスタンス変数を直接使用することになり、setter を呼び出すことはありません。したがって、元の例では、セッターを使用していません。

@synthesizeところで、これが一般的に、ステートメントで別の ivar 名を使用することをお勧めする理由です。たとえば、次のようになります。

@synthesize thePlayer = _thePlayer;

こうすることで、プロパティの意味でインスタンス変数を誤って参照する可能性が低くなります。また、Xcode 4.4 以降では、@synthesizeステートメントを省略した場合、これがデフォルトの動作になります (合成されたインスタンス変数の先頭にアンダースコアが付きます)。

于 2012-09-19T02:20:56.367 に答える