0

Xcode の一部の古いバージョンでは、オブジェクトのプロパティを問題なく使用できることに気付きましたself。なしで自分のプロパティにアクセスしようとするとエラーが発生しますselfが、今日はこのコードを書いていますが、正常に動作し、エラーは発生しません。

[aCoder encodeObject:itemName forKey:@"itemName"];

なぜこのようになっているのですか?この場合、エラーが発生しないのはなぜですか? 他の場合にエラーが発生するのはなぜですか? この動作を統一できないのはなぜですか? また、何を使用すればよいですか?

4

4 に答える 4

3

なしではプロパティにアクセスできませんでしたself。を使用しなかった場合はself、プロパティと同じ名前のインスタンス変数に直接アクセスしていました。これは、多くの開発者に際限のない問題を引き起こしました。

これが、(Xcode の最新バージョンの) 最新のコンパイラが先頭のアンダースコアでプロパティ ivar を生成する理由です。このように、プロパティにアクセスしようとしたときに使用するのを忘れた場合self、同じ名前の ivar がないためエラーが発生します。

エクスペリエンスを統一するには、古いコンパイラで次のパターンを使用する必要があります。

を定義し@property int foo;ます。次に ivar を定義しますint _foo。そして、使用します@synthesize foo = _foo;

新しいコンパイラでは、宣言するだけ@property int fooで完了です。コンパイラが ivarint _fooを生成します。

どちらの場合もself.foo、プロパティに使用し_foo、ivar に直接アクセスします。

于 2013-04-10T17:48:36.317 に答える
1

新しい LLVM コンパイラでプロパティを作成すると、常にという名前の ivar が作成され_propertyます。

auto- synthesized をオーバーライドしない場合は、 _propertyorを使用する必要がありますself.property

あなたの場合、古いコンパイラを使用しているように見えます(つまり、XCode4.3 バックワードが付属しています)。

@synthesize aCoder;
于 2013-04-10T17:19:34.613 に答える
1

この警告を意味していると思います:

ここに画像の説明を入力

多くのプロジェクトでは、ビルド設定で多くの警告が有効になっていないため、この警告が表示されない理由の 1 つである可能性があります。

インスタンス変数に直接アクセスするのが一般的な特定のメソッドもあり、Xcode は ivar への直接アクセスを無視します。これらにはメソッドが含まinit*deallocます (ただし、残念ながら getter/setter メソッドは含まれません)。

于 2013-04-10T17:30:49.467 に答える
0

クラスでプロパティを定義し、@synthesizeそれらが同じ命名を使用する場合、self なしでそれらにアクセスできます

例えば

.h で

@property(nonatomic, copy) NSString *str1;

.m

@synthesize str1 = str1;

str1 = @"hello";
self.str1 = @"hello"; // Or this

explicit を使用しない場合@synthesize、XCode は@synthesize property = _property(最近から) 自動的に使用するため、次のことができます。

.h で

@property(nonatomic, copy) NSString *str1;

.m

_str1 = @"hello";
self._str1 = @"hello"; // Or this

selfプロパティが親クラスで定義されている場合は使用できません。それを使用できるようにするには、現在のクラスで合成する必要があります。

于 2013-04-10T18:20:35.457 に答える