2012-02-10 65 views
6

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

我剛開始iPhone應用程序開發和發現,當你生成一個新的項目,下面的代碼可以在AppDelegate中看到。 m

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

AND在AppDelegate.h文件中它說

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

我只想知道這到底意味着什麼,特別是合成部分。是否 實例化一個本地私有變量?如果是這樣,這與說 @synthesize 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 /查詢q =%5Bobjc%5D +下劃線+屬性&提交=搜索 – 2012-02-11 01:27:32

回答

6

模式@synthesize foo = bar;允許你定義它獲取組合合成了名bar(或者,如果你想_foo)的實例變量鍵foo的屬性,而@synthesize 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實例變量將在可以通過使用任一_fooself->_foo(其中前者實際上是一個隱式的形式),這將不涉及訪問器方法調用什麼。

雖然合成屬性將通過self.foo使用,然後它將利用對合成訪問器方法之一的調用。

只要想到@synthesize foo;作爲隱含的(注意這裏缺少一個_,等號)。

5

或多或少。在.H這些行聲明兩個所謂的窗口和控制公共變量的存在:

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

但這些線路只聲明變量的存在,它們實際上並不創建它們。無論它是否需要實現這些,它都是由該類實現的 - 例如,它們可以是虛擬變量,但實際上並不存在,而是調用以編程方式創建數據的方法,或從數據庫或其他東西中加載數據的方法。

.m文件中的這些行實際上創建(「合成」)變量。

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

這些行實際上說的是內部變量名是_window,但變量的公共名稱是窗口。這意味着,在類中你可以這樣

_window = something; 

直接訪問變量,但外部您在使用

appDelegate.window = something; 

因爲這是它的公共名稱來訪問它。你也可以使用self.window在內部訪問它。

Objective-C的另一個有趣的事實是,使用點語法以這種方式訪問​​變量實際上只是調用setter和getter方法來訪問它們的方便方法。所以合成路線,除了創建一個名爲_window變量,也定義了以下兩種方法:

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

,您可以直接,如果你喜歡調用這些方法,使用

[self setWindow:someValue]; 
UIWindow *window = [self window];