9

@propertyそのため、ヘッダーファイルのキーを使用します。

そう@synthesizeする場合は、実装でキーを使用する必要がありますよね?しかし、私がそれをしなければならない実際の理由があるのだろうか?@propertyコードが私の意図を知るのに十分なだけヘッダーに書き込んでいないのはなぜだろうと思っています(get / setメソッドが自動的に生成されます)。

確かに、なぜ私たちは合成しなければならないのですか?@synthesizeget/setメソッドを生成するために記述します。しかし、私の質問は、なぜ@propertyこれに十分なヘッダーがないのかということです。@propertyヘッダーに書き込むときはいつでも、すぐに実装に移動してを書き込むので、私は尋ねます@synthesize。だから私にとって、唯一の理由@synthesize@propertyキーワードを補完することです。これはかなり冗長に思えますが、他の用途が@synthesizeあるために存在しなかった場合は存在しなかったと思います。それらの他の用途は何ですか?

4

2 に答える 2

5

@synthesize2つのことをします。ゲッター/セッターのペアを生成し、プロパティのiVarを作成します。

これら2つのことのうち、iVarの作成は、使用する場合と使用しない場合の鍵になると思います@synthesize。内部にiVarsとして保存されていないメンバーのプロパティを作成する場合、(明らかに)私は使用しません@synthesize

今後の自動合成機能はあまり役に立ちません。私は常にiVarに先頭に「_」という名前を付けているので、明示的に合成する必要があります。

@AndrewMadsenリンクを参照してください。「_」プレフィックスの自動合成によってiVarが生成されるようです。

W00t!言うまでもなく、私は今、自動合成にもっと興奮しています!

于 2012-07-24T15:46:15.533 に答える
0

インスタンス変数のゲッターとセッターを生成し、内部で使用する場合とクラスの外部から使用する場合の両方で、次のように、実際の魔法がセッターにあります。

- (void)setValue: (id)newValue
{
    if (value != newValue)
    {
        [value release];
        value = newValue;
        [value retain];
    }
}

これは@property (nonatomic, retain)...

本当の魔法は、インスタンス変数を(オブジェクト自体の内部または外部から)設定するたびに、渡されたnewValueを(保持して)所有していることを確認し、古い値を解放して新しい値を設定することです。
したがって、古いインスタンスを手動で解放しなくても、インスタンス変数を複数回設定することができます。それは速度オプションだけです:-)

于 2012-07-24T16:06:01.420 に答える