2

Xcode の最新バージョンでは、プロパティをサポートする変数が自動的に作成されます。たとえば、@property (nonatomic, assign) BOOL isOpen自動的に作成されますBOOL _isOpen。プロパティが非物理的であることを意図しているときに、そのような変数が作成されないようにする方法はありますか? 次の非物理isOpenプロパティの例では、_isOpenは必要ありません。同僚がうっかり使ってしまい_isOpen、なぜ何も起こらないのか不思議に思ったので、実際には有害です。

- (void) setIsOpen:(BOOL)isOpen
{
    if (isOpen) {
        [self.specialView open]
    } else {
        [self.specialView close];
    }
}

- (BOOL) isOpen
{
    return self.specialView.alpha > 0.0;
}
4

2 に答える 2

3

セッターとゲッターの両方を実装すると、変数は作成されません。Appleのドキュメントから:

コンパイラは、少なくとも 1 つのアクセサー メソッドも合成しているすべての状況で、インスタンス変数を自動的に合成します。プロパティのゲッターとセッターの両方readwrite、またはプロパティのゲッターを実装する場合readonly、コンパイラは、プロパティの実装を制御していると想定し、インスタンス変数を自動的に合成しません。

あなたの同僚はまったく参照できないはず_isOpenです。Xcode 4.6.3 でコードを確認しましたが、仕様どおりに動作します。変数は作成されません。

于 2013-10-31T00:25:53.570 に答える
1

ゲッターとセッターの両方を指定する必要があります。それを行うと仮定すると、インスタンス変数は作成されません。

ゲッターにも別の名前を指定できることに注意してください。ブール値のプロパティの場合、isプレフィックスは通常削除されますが、「オープン」の場合はそのままにしておくことがあります。接頭辞を付けたほうがわかりやすいと思います。

ただし、他のブール値のプロパティについては、次のようなものが好まれる場合があります。

@property (nonatomic, assign, getter=isOpen) BOOL open;

それで:

  • と を実装setOpenisOpenます。
  • BOOL value = object.openまたはを使用して読み取るBOOL value = [object isOpen]
  • object.open = valueまたはを使用して記述し[object setOpen:value]ます。

使用@dynamicする必要はありません。最近のコンパイラは、ゲッターとセッターの両方を指定したことを検出します。@synthesizeも必要ないはずです。(いくつかのエッジケースがあります。必要なケースに遭遇した場合は、必ずそこで使用してください)。

ただし、ここでは最新のランタイムについて話していることに注意してください。32 ビット OSX ターゲットは、ルールが異なる従来のランタイムを使用します。

于 2013-10-31T00:33:51.333 に答える