2013-03-02 12 views
5

Xcode 4.4より前のほとんどのプロジェクトでは、開発者は同じ名前のアイバールとプロパティを同時に宣言していました。例ivarとプロパティを同じ名前で宣言する必要があるのはなぜですか?

@interface SecondViewController : UIViewController 
{ 
    NSString *string; 
} 

@property (strong, retain) NSString *string; 

だからわからないのですか?

+1

DUP:http://stackoverflow.com/questions/5555736/objective-c-why-do-we-declare-ivars-in-the-h-member-area- if-property-seems-to- – justin

答えて

1

私は他の人に話すことはできませんが、私は同じ名前を使用しません。インスタンス変数を宣言した場合は、アンダースコアが先頭についているので、インスタンス変数またはsetter/getterメソッドを参照しているのは明らかです。

Xcode 4.4+では、インスタンス変数を宣言するか、@synthesizeを呼び出す必要はなく、コンパイラーは自動的にインスタンス変数を作成し、先頭のアンダースコアでインスタンス化し、セッター/ゲッターメソッドを提供します。

しかし、このメカニズムは非常に良いアイデアだと思います。デベロッパーは、公開されるべきではないクラスのプロパティを公開することを奨励しています。

は、例えば、これは以降のiOS 6の開発から取られている:私はあなたが一度にあまりにも多くの概念と初心者を混乱させたくないことを理解しながら、今

@interface BIDViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UIButton *button; 
- (IBAction)buttonPressed:(UIButton *)sender; 
@end 

、あなたはすぐに持っていますオブジェクト指向カプセル化に違反しました。UIButtonオブジェクトとアクションメソッドの両方をこのビューコントローラのユーザーに公開し、いずれも公開しないでください。

何が起こる、例えば、使用するクラスがない場合は、この:

BIDViewController *vc = ...; 
vc.button = nil; 

または

vc.buttonPressed(mySegmentedControl); 

すべての地獄の休憩が緩ん。今ではプログラムを壊す1000の方法があり、すべてを防御することはできませんが、すでに弱いシステムを作りたいとは思っていません(Objective-Cは誰を呼び出すことができるかどうかを定義するという点であなたの方法の)弱い。

上記の実装は、より良いInterface Builderので表彰され、どちらもプライベートインスタンス変数やメソッドを使用して行われます。

@implementation BIDViewController() 
{ 
    IBOutlet UIButton *_button; 
} 
- (IBAction)_buttonPressed:(UIButton *)sender; 

@end 

と任意の使用してクラスがそのモデルを壊すの厳しい時間を持つことになります。

もちろん、これは開発者のための考え方とタイピングであるため、Appleは新しい機能を導入しているので、短時間で処理したいものを手に入れることができます。ヘッダファイルと、宣言と実装の両方のスケルトンが用意されています)。

+0

"インスタンス変数やsetter/getterメソッドを参照しているのは明らかです。"とにかく明白です: 'self.foo'はプロパティ、' foo'はivarです。 –

+0

@ H2CO3「自己」ビットを見逃すのは簡単な間違いです... – trojanfoe

+0

この記事で見る通り: http://inessential.com/2010/06/28/how_i_manage_memory 著者はivarを使用しています同じ名前の物件があります。私は彼の意図を理解していません。 – Proton

7

スタイルの問題で、過去のコンパイラの動作に使用されています。

新しいコンパイラでこれは必須ではありません。プロパティを作成するとすぐに、シーンの後ろにivarが作成され、合成されます。

コンパイラは_propertyNameというエイリアスで合成します。このデフォルト動作を変更することもできます。

@interface AppDelegate : NSObject <NSApplicationDelegate>{ 
    NSString *bigString; 
} 
@property(strong)NSString *smallString; 
@end 

@implementation AppDelegate 
@synthesize smallString=bigString; 
-(void)awakeFromNib{ 
    [email protected]"hello"; 
    NSLog(@"%@",self.smallString); 
} 

@end 
+0

正解+1です。これはXcodeバージョンの問題ではなく、特定のバージョンのコンパイラで実装されている言語の方言の問題です。 –

+0

@ H2CO3:ありがとう、そして私に+1を与えるたびに、私は気分がいいです:) –

+0

この行の意味 '@synthesize smallString = bigString; ' – Proton

関連する問題