-2

私はios開発とxcodeが初めてです。

xcode4.6 では@synthesize、IDE が自動的にステートメントを使用するため、プログラマーはステートメントを使用する必要がないことを教えられました。

しかし、なぜ私のIDEがそれを設定していないのかわかりません。

@property (nonatomic,strong) NSDictionary *dictionary;

何かを設定しようとすると

dictionary = [[NSDictionary alloc]initWithContentsOfFile:resource];

宣言されていない識別子は、_dictionary のことですか? いいえ、_dictionary という意味ではなく、辞書を意味していました。したがって、実装に合成プロパティを手動で追加すると、すべてが正常に機能しているようです。

ここで何が起こっているのか誰か教えてくれませんか。

4

4 に答える 4

4

そのプロパティの基になるインスタンス変数は、実際には_dictionaryです。これが自動合成プロパティの仕組みです。

ただし、アクセサーを使用してプロパティを設定することを検討する必要があります (self.dictionary =代わりに使用してください)。この背後にある理由については、「目的 c で ivar とプロパティを使用する理由」に対するこの回答を参照してください。


また、変更可能なサブクラス (NSMutableString、NSMutableArray、または NSMutableDictionary) がプロパティに割り当てられてから変更されるというミスを防ぐために、NSDictionary、NSArray、NSString などのクラスのstrongプロパティをに変更することを検討してください。copy

于 2013-09-02T09:48:08.877 に答える
2

@synthesize dictionary以前は、@synthesize によって生成されたゲッターとセッターに関連する変数@synthesize dictionary = _dictionarywhereは次のように記述されていました。_dictionary

= _variableNameXCode 4 以降はスキップしても安全ですが、合成された属性の名前に一致する変数が生成されます。

dictionaryあなたの場合、 はセッターおよびゲッターとしてのみ使用されます[self setDictionary:object]または[self dictionary].

手動で値を割り当てたい場合は、_dictionary = object;を使用します。これを行うと、KVC に準拠していないことを必ず理解してください。値が変更されようとしていることをオブザーバーに通知する必要があります。

于 2013-09-02T09:53:52.027 に答える
0

忘れましたself.:

self.dictionary = [[NSDictionary alloc]initWithContentsOfFile:resource];

self.dictionaryディクショナリ オブジェクトのセッター メソッドを呼び出します。dictionary単独で、関数に対してローカルな変数またはオブジェクトのインスタンス変数のいずれかの変数をアドレス指定しようとします。あなたの場合、setter メソッドに対処したいと考えています。

于 2013-09-02T09:48:11.607 に答える
-3

_dictionaryself.dictionaryXcode4.6と同等

これは、同じ現在のクラスのオブジェクトにアクセスしていることを確認するためです。

于 2013-09-02T09:52:12.307 に答える