2011-10-12 88 views
2

我一直在爲iPhone的核心數據做一些教程,並沒有一個似乎工作。幸運的是,提供的源代碼,並且保持雨後春筍般冒出來一個問題教程網站之一(而且是希望在解釋爲什麼說教程不工作),是這一行:window = _window

@synthesize window = _window; 

半打綜合類像這樣會在我的tableview文件中自動生成,但沒有任何教程使用它們,這對我造成了很多錯誤。工作源代碼中的行是:

@synthesize window; 

那麼,這是爲什麼?我在網上讀到@synthesize的第一個版本是爲了內存管理的目的,但似乎沒有人使用它。

+0

此語法通常用於防止「意外」訪問伊娃直接(一種可能的情況是通過其評估方法懶惰地創建變量時) – Rog

回答

1

這裏唯一的區別是實例變量在自動生成時如何命名。

在這個版本:

@synthesize window = _window; 

你有效地獲得這些(假設你沒有設置@propertyreadonly):

UIWindow *_window; 
- (UIWindow *)window; 
- (void)setWindow:(UIWindow *)aWindow; 

有了另一個版本:

@synthesize window; 

你得到這個:

UIWindow *window; 
- (UIWindow *)window; 
- (void)setWindow:(UIWindow *)aWindow; 

第二個版本等於:

@synthesize window = window; 
1

聲明這樣的:

@synthesize window = _window; 

意味着window是映射到實例/成員變量_window的屬性。

Wheras

@synthesize window; 

相同

@synthesize window = window; 
-2

切勿採用單前導下劃線,爲您的伊娃或方法名稱的前綴。這是一個Apple 內部編碼約定,並且它們這樣做是爲了使它們的符號不會與您的符號相沖突。

如果你合成一個屬性,告訴它在已經有一個名爲_window,你會在試劑盒中重挫代碼伊娃一類的UIKit中的任意子類使用_window。其他可能與您碰撞的常見伊娃名稱是_delegate_target_view

+0

這是一個公平點,但不回答問題。 – Rog

+4

如果您的建議是不使用下劃線,那麼當我使用iPhone模板時如何生成這些變量?他們在我觸摸代碼之前就在那裏。 – user990769

+0

偉大的觀察! NSResponder會迴應嗎? – TigerCoding

0

我一直與我一直在努力的教程有同樣的問題。

對於我的東西,我可以通過最小的改變使它工作的方式是在頭文件接口部分添加 UIWindow *window;,因爲這不是由Xcode自動添加的,而是由教程內容預期的。

然後我改變了部分地方調用

[window addSubview:tabBarController.view]; 

[self.window addSubview:tabBarController.view]; 

這似乎現在的工作。我正在閱讀的教程是基於以前版本的Xcode,所以我認爲事情已經改變。 UIWindow行不會自動添加,並且Xcode已經開始使用_window作爲自己的東西。

不管怎樣,任何人都可以給出一個更清晰的解釋,因爲我在這裏黑暗中磕磕絆絆。