2012-02-05 8 views
6

gettersおよびインスタンス変数の使用に関する質問があります。例を見てみましょう。インスタンス変数またはゲッターメソッドを使用する場合のiOS

私は.hファイルであるとします。このように変数こと

@property (nonatomic,strong) NSString *name 

と私は合成.mファイル内:

@synthesize name = _name; 

が今私の質問は:違いは何ですか使用:

[self.name aMethod] 

[_name aMethod] 

ありがとう!

答えて

8

最初のものは、ゲッターメソッドを使用してivarにアクセスします。 2番目は直接ivarにアクセスします。これは単純な合成プロパティなので、最初のメソッド呼び出しではそれほど大きな違いはありません。しかし、プロパティがアトミックまたはダイナミックである場合、またはゲッターメソッドが複雑な場合は、最初のものが実際にはアトミックになり、2番目のものはアトミックではなく、最初のものは実際には2人目はゲッターしない。第2の呼を単にそのまま残したまま

[[self name] aMethod] 

:簡単に言うと

は、コンパイラへの最初の呼び出しを再書き込みを行います。

1
[self.name aMethod] 

したがってゲッターが呼び出されると、メッセージは、その結果に送られる

[[self name] aMethod] 

と等価です。

あなたの場合、表示される結果は同じになります。

しかし、ゲッターが簡単ではない(つまり合成されていない)場合もあります。

0

ゲッターを通じた最初の呼び出し - これは[[self name] aMethod]と同じです。 2つ目は直接アクセスを使用するだけです。

通常、アクセサーの使用をお勧めしますが、そこから外れるべき時があります。最も一般的なのは、イニシャライザやdeallocなど、部分的に構成された状態であることです。その理由は、あなたの状態を慎重に構築したり破壊したりして、オブジェクトのインタフェースセマンティクスには関心がないことです。つまり、アクセサーを使用すると、負の動作上および意味上の副作用が生じる可能性があります。

詳細については、こちらをご覧ください。 Why would you use an ivar?

関連する問題