-1

長い間読んですみません。これは私が混乱している本の一部です。

(Xcode 4が採用している)コーディング規約の現在の傾向は、インスタンス変数名の主役としてアンダースコア(_)を使用することです。したがって、Xcodeによって生成された_で始まる変数への参照は、インスタンス変数を名前で直接参照しています。次のような@synthesizeディレクティブが表示された場合

@synthesize window = _window;

_windowに割り当てる代わりに、そもそも@ property / synthesizeで宣言できなかったのはなぜwindowですか?

これは、windowという名前のプロパティのゲッターとセッターを合成し、そのプロパティを_windowというインスタンス変数(明示的に宣言する必要はありません)に関連付けることを示しています。これは、インスタンス変数の使用とプロパティを区別し、setterメソッドとgetterメソッドを使用してインスタンス変数の値を設定および取得するように促すのに役立ちます。つまり、このようなものを書く

[ウィンドウmakeKeyAndVisible]; //これは機能しません

windowという名前のインスタンス変数がないため、失敗します。代わりに、インスタンス変数にその名前で直接名前を付ける必要があります。

[_window makeKeyAndVisible];

または、できれば、アクセサーメソッドを使用します。

[self.window makeKeyAndVisible];

self.window他の方法でアンダースコアが必要ないのはなぜですか?

4

2 に答える 2

0

構文self.windowは実際にはメソッドを呼び出しています(そうではないように見えるかもしれませんが)。たとえば@synthesize、名前を@property付けたwindow 場合や- (id) window { ... }自分のようなメソッドを定義した場合は、self.windowそのメソッドを呼び出して、返された値を表します。同様に、self.window = value;暗黙のうちにあなたを呼び[self setWindow:value]ます。

@propertyたとえば、を使用して、これらのデフォルトメソッドの名前を変更できますgetter=

于 2012-07-26T02:54:35.880 に答える
0

setter/getterメソッド内でのみアンダースコアivarにアクセスします。この場合、との実装内に- (UIWindow *)windowあり- (void)setWindow:(UIWindow *)windowます。クラスの実装の他の場所で@propertyは、合成されたivar(self.window)ではなく、を参照してください。私の初期のobj-cの時代に私が理解するのを助けた一つのことはこれでした:ただ規則に従うことself.window = ...;と同義で[self setWindow:...];あり、あなたは一人幸せになるでしょう

AppleのObjective-Cの内部実装により、非常に気の利いたメモリ管理が実現します。これらのルールを遵守している限り、対処する必要はありません。典型的なアップルですが、動作します。

于 2012-07-26T04:14:25.923 に答える