2012-02-10 6 views
6

可能な重複の意味:
Prefixing property names with an underscore in Objective CのViewController = _ViewController

を私はiPhoneアプリの開発を開始し、新しいプロジェクトを生成する際に、次のコードは、AppDelegateで見ることができることに気づきました。 m

@synthesize window = _window; 
@synthesize viewController = _viewController; 

また、AppDelegate.hファイルには、

@property (strong, nonatomic) UIWindow window; 
@property (strong, nonatomic) ViewController controller; 

私はちょうどこれが何を意味するか、特に合成部分を知りたいと思います。 ローカルのプライベート変数をインスタンス化していますか?もしそうなら、これはどういう意味ですか? @ viewControllerを合成します。

おかげ

+1

HTTPを使用して、これらのメソッドを直接呼び出すことができます/ /stackoverflow.com/q/7174277/ http://stackoverflow.com/q/822487/ http://stackoverflow.com/q/2371489/ http://stackoverflow.com/q/6139593/ http:// stackoverflow .com/search?q =%5Bobjc%5D +アンダースコア+プロパティ&submit =検索 –

答えて

6

単にプロパティとインスタンス変数を合成@synthesize foo;ながら@synthesize foo = bar;はあなたが名前bar(または_fooあなたがしたい場合)のインスタンス変数との組み合わせで合成されますキーfooのプロパティを定義することを可能にするパターン、同じ名前で(foo)です。

@property (...) Foo *foo; 
@synthesize foo = _foo; 

これと同等の一種である:

@interface MyClass : NSObject { 
    //result of @synthesize...: 
    Foo *_foo; 
} 

//result of @property...: 
- (void)setFoo:(Foo *)foo; 
//result of @property...: 
- (Foo *)foo; 

@end 

@implementation MyClass 

//result of @synthesize...: 
- (void)setFoo:(Foo *)foo { 
    _foo = foo; //simplified! 
} 

//result of @synthesize...: 
- (Foo *)foo { 
    return _foo; //simplified! 
} 

@end 

synthezisedインスタンス変数は、_foo又はself->_fooのいずれかを介して使用される(前者は、実際に暗黙形式となっている)、無含むであろうアクセサメソッド呼び出しは何でも。

合成された特性は、self.fooを介して使用されますが、合成されたアクセサメソッドの1つを呼び出すことになります。

@synthesize foo;を暗黙的なと考えてください(ここでは_がないことに注意してください)。

5

多かれ少なかれ。彼らは実際にそれらを作成しない、

@property (strong, nonatomic) UIWindow window; 
@property (strong, nonatomic) ViewController controller; 

しかし、これらの行は、変数のみが存在することを宣言します.Hにおけるこれらの行は、ウィンドウと、コントローラと呼ばれる2つのパブリック変数が存在することを宣言します。しかし、実際には存在しないが、プログラムでデータを作成するメソッドを呼び出すか、データベースなどからロードすることができます。

.mファイルのこれらの行は実際に変数を作成(合成)します。

@synthesize window = _window; 
@synthesize viewController = _viewController; 

これらの行が実際に言うことは、内部変数名は_windowですが、変数のパブリック名はwindowです。それはクラス内で使用すると、

_window = something; 

を言って直接変数にアクセスできることを意味しかし、それは、それは公共の名前だなので、外部あなたは

appDelegate.window = something; 

を使用してアクセスする必要があります。また、self.windowを使用してクラスに内部的にアクセスすることもできます。

Objective-Cのもう一つの興味深い事実は、ドット構文を使用して変数にアクセスすることは、実際にセッターとゲッターのメソッドを呼び出す便利な方法です。 SOのsynthesizeラインは、_windowという変数を作成することに加えて、以下の2つのメソッドを定義している:

- (void)setWindow:(UIWindow *)window; // to set the _window variable 
- (UIWindow *)window; // to get the _window variable 

そして、あなたが好きなら、あなたは

[self setWindow:someValue]; 
UIWindow *window = [self window]; 
関連する問題