1

私のコードには、約 5 つの@propertyステートメントがあります。それらにアクセスすると@synthesize = ...、オブジェクトのドロップダウン メニューで (プロパティ名の) 選択肢が表示されるものと、表示されないものがあります。_propertyまた、メソッドですべてのプロパティを変更しなくても、実行に違いはないこともわかりました。アプリはまだ動作します。

プロパティ名にプレフィックスとしてアンダースコアが含まれているかどうかに関係なく、アプリが実行されるのはなぜですか?

4

2 に答える 2

2

を使用する@synthesize iVar = _iVar;必要がありますが、すぐに合成する必要がなくなるでしょう ;)

Xcode によって提供されるオプションは、コード補完に少しバグがあるだけだと思います。

厳密に言えば、使用する名前はまったく問題ではなく (衝突がない限り)、@synthesize iVar = i_va_R;完全に合法です。

@synthesize foo = bar;
@synthesize bar = foo;
// DO NOT DO THIS IN REAL LIFE!!

あなたが言っているのは、指定された名前のインスタンス変数によってプロパティがサポートされるようにすることだけです。インスタンス変数に直接アクセスしない場合 ( orself.iVarではなく常に使用する場合)、使用するものはまったく問題ではありません。iVar に直接アクセスする場合は、コードの残りの部分だけが問題になります。iVar_iVar

もう少し明確にするために、プロパティを使用せずに上記を実装する方法の例を次に示します。

@interface MyBadClass {
    int foo;
    int bar;
}

- (int)foo;
- (void)setFoo:(int)foo;

- (int)bar;
- (void)setBar:(int)bar;

@end

@implementation MyBadClass

- (it)foo
{
    return bar;
}

- (void)setFoo:(int)foo
{
    bar = foo;
}

- (int)bar
{
    return foo;
}

- (void)setBar:(int)bar
{
    foo = bar;
}

@end

(PS:intメモリ管理を避けるために s を使用していますが、オブジェクトにも同じことが当てはまります)

于 2012-06-29T22:45:53.423 に答える
0

32 ビット ランタイムでは、ivar をサポートするプロパティが自動的に作成されないため、問題が発生する可能性があります。 32ビットMac OSでは壊れます

于 2012-06-30T16:25:40.333 に答える