Xcode 4.4より前のほとんどのプロジェクトでは、開発者は同じ名前のアイバールとプロパティを同時に宣言していました。例ivarとプロパティを同じ名前で宣言する必要があるのはなぜですか?
@interface SecondViewController : UIViewController
{
NSString *string;
}
@property (strong, retain) NSString *string;
だからわからないのですか?
Xcode 4.4より前のほとんどのプロジェクトでは、開発者は同じ名前のアイバールとプロパティを同時に宣言していました。例ivarとプロパティを同じ名前で宣言する必要があるのはなぜですか?
@interface SecondViewController : UIViewController
{
NSString *string;
}
@property (strong, retain) NSString *string;
だからわからないのですか?
私は他の人に話すことはできませんが、私は同じ名前を使用しません。インスタンス変数を宣言した場合は、アンダースコアが先頭についているので、インスタンス変数または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は新しい機能を導入しているので、短時間で処理したいものを手に入れることができます。ヘッダファイルと、宣言と実装の両方のスケルトンが用意されています)。
スタイルの問題で、過去のコンパイラの動作に使用されています。
新しいコンパイラでこれは必須ではありません。プロパティを作成するとすぐに、シーンの後ろに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
正解+1です。これはXcodeバージョンの問題ではなく、特定のバージョンのコンパイラで実装されている言語の方言の問題です。 –
@ H2CO3:ありがとう、そして私に+1を与えるたびに、私は気分がいいです:) –
この行の意味 '@synthesize smallString = bigString; ' – Proton
DUP:http://stackoverflow.com/questions/5555736/objective-c-why-do-we-declare-ivars-in-the-h-member-area- if-property-seems-to- – justin