2011-06-21 12 views
2

まあ!そのプロパティを実装する変数&を宣言する方法について混乱しました。プロパティ - Objective-Cでの変数の実装

.hファイルの内容

@interface XYZAppDelegate : NSObject <UIApplicationDelegate> { 

} 
@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet XYZViewController *viewController; 
@end 

.mファイルの内容

#import "XYZAppDelegate.h" 
#import "XYZViewController.h" 
@implementation XYZAppDelegate 
@synthesize window=_window; 
@synthesize viewController=_viewController; 

次のように私の質問/クエリです。

  • プロパティを設定する場合、変数を宣言する必要はありませんか? (プロパティを使用すると、間接的に変数を宣言することができます - そのようなのですか?)
  • これ以外の追加機能は何ですか? (コーディング固有の)
  • なぜ、すべてのプロパティアクセサーの前に_を使用すると主張していますか? (セキュリティ上の脅威以外にも、コード化の標準となっているのはなぜですか?その理由は何ですか?)
+0

@Abizern - タグを編集していただきありがとうございます。それは新しいものを投稿する際に私を助けます。 –

答えて

4
  • 変数を宣言する必要はありません。それは自動的に行われます、 私は@synthesizeによって信じています。 1つの は、 デバッガがそれを自動的にリストするという利点があります。 重複定義の醜さと比較してください。
  • その他の機能:読み取り専用プロパティ 割り当てられていない(保持されていない)値。
  • アンダースコアは という名前のメンバー変数の規則で、 とプロパティとは異なる名前が付けられ、 メソッド変数です。アップルのサンプル は時々この慣例を使用し、 はしばしば使用しません。私は と表示しています。通常、 プログラマは、 の違いをmyVariableと というself.myVariableの間で区別して表示します。
2

いいえ、新しい64ビットのみの機能はありません。変数は自動的に宣言されます。

(2)ここであなたが何を求めているのか分かりません。

(3)変数名がアクセサー名と異なるようにするのは単なる規則です。あなたが対処していることをより明確にします。

+0

2)この機能のような追加機能は、XCode4に関連する新しい機能をコーディングします。 (質問はXCode4に固有です) –

4

1)財産を置く場合、変数を宣言する必要はありませんか? (プロパティを使用すると間接的に変数を宣言することができます - それはそうですか?)

いいえ該当するプロパティの変数を宣言する必要はありません。これらの変数を作成するようにコンパイラに指示する@synthesize propertyNameコマンドを使用する必要があります。

2)どうして皆が各プロパティのアクセッサーの前に_を使用すると主張していますか? (セキュリティ上の脅威以外にも、コーディングの標準となっていますか?その理由は何ですか?)

ほとんどの人)は、メモリ管理の悪夢に襲われている。これらのうちのいくつかは、怠惰な/怠惰な/ゼロスリープコーディングによって引き起こされます。 @synthesize propertyName = _propertyNameを使用すると、プログラマーは、下線付き変数がクラスに対してプライベートであり、保持されていないことを直ちに知ることができます。これは、オブジェクトをプロパティに格納するためにオブジェクトを特別に割り当てたりコピーしたり、誤ってオートリリースされたオブジェクトをivarに割り当てることを防止します。

は検討:

1)自動解放オブジェクトが保持されないIVARに割り当てられます。

@synthesize propertyName; 
propertyName = [NSString stringWithFormat:@"I've just made %@", "a boo-boo."]; 

は「プロパティ名は、」今(それが再び参照さだとすぐに)道EXEC_BAD_ACCESSエラーが作成されますすぐには存在しませんオブジェクトを参照します。

2)保持されたオブジェクトが保持されたプロパティに設定されている。

@synthesize propertyName; 
self.propertyName = [[NSString alloc] initWithFormat:@"I just created %@", @"a leak"] 

今、私たちはNSStringオブジェクトを作成し、変数を保持され、それ自体propertyNameプロパティに設定しました。オブジェクトは二重に保持され、適切に解放されません。

イーズカーズにアンダースコアを正しく付けると、これらの問題はどちらも戦闘(疲れているにもかかわらず、それほどではありませんが)しやすくなります。これは馬鹿な方法ではありませんが、頭の中のオブジェクトの保持カウントを管理することがかなり簡単になります。

+0

うわー! 2番目の質問に関する素晴らしい説明。 –

+0

デバッグにアンダースコアを使用し、検索/置換でアクセサーの使用方法の特定のケースを検索することは本当に安全です – petershine

関連する問題