2011-06-21 50 views
2

好吧!我對聲明變量&實現其屬性的方式感到困惑。是屬性 - 在Objective-C中實現變量

.h文件內容

@interface XYZAppDelegate : NSObject <UIApplicationDelegate> { 

} 
@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet XYZViewController *viewController; 
@end 

.m文件內容

#import "XYZAppDelegate.h" 
#import "XYZViewController.h" 
@implementation XYZAppDelegate 
@synthesize window=_window; 
@synthesize viewController=_viewController; 

我的問題/查詢如下。

  • 如果我們放置屬性,我們不需要聲明變量嗎? (使用屬性,我們可以間接聲明變量 - 是這樣嗎?)
  • 除此之外,還有哪些其他功能? (在具體編碼中)
  • 爲什麼大家堅持在每個屬性訪問器之前使用_? (除了安全威脅?它是否成爲編碼標準?背後的原因是什麼?)
+0

@Abizern - 感謝您的標籤編輯。這會幫助我發佈新內容。 –

回答

4
  • 您不必聲明 變量。它自動完成, 我相信@synthesize。一個 的優勢是聲明它是 調試器將自動列出它。 稱重於冗餘定義的醜陋。
  • 其它功能:只讀屬性, 分配(未保留)值。
  • 下劃線是 命名成員變量的約定,其中 與屬性的不同名稱和 方法變量的名稱不同。蘋果公司的樣品 有時使用這種約定, 有時不使用。我認爲這是 通常不必要地詳細的作爲 程序員可以很容易地分辨MYVARIABLE和 self.myVariable之間的 差。
2

(1)否,不具備新的64位唯一功能。變量會自動爲您聲明。

(2)我不知道你問這裏。

(3)這只是一個慣例,使變量名是從訪問者名稱不同。使它更清晰你正在處理。

+0

2)像XCode4這樣的其他功能 - 編碼相關的新功能。 (問題是XCode4具體) –

4

1)如果我們放置屬性,我們不需要聲明變量嗎? (使用屬性,我們可以間接聲明變量 - 是這樣嗎?)

不需要你爲相應的屬性聲明變量。您需要使用@synthesize propertyName命令,該命令告訴編譯器爲您創建這些變量。

2)爲什麼每個人都堅持每一個屬性訪問前使用_? (除了安全威脅?它是否成爲編碼標準?請告訴我這背後的原因是什麼?)

大多數人(全部?)被記憶管理惡夢刺痛了。其中一些是由馬虎/懶惰/零睡眠編碼引起的。使用@synthesize propertyName = _propertyName允許程序員立即知道下劃線變量對於該類是私有的,並且是未保留的。它可以防止您專門分配或複製對象以存儲在屬性中的問題,或者意外地將自動釋放對象分配給ivar。

考慮:

1)一種自動釋放對象被分配到一個未保留的ivar。

@synthesize propertyName; 
propertyName = [NSString stringWithFormat:@"I've just made %@", "a boo-boo."]; 

「PROPERTYNAME」現在引用的對象將很快不存在,(因爲它再次引用盡快),這將創造EXEC_BAD_ACCESS錯誤的道路。

2)保留對象被設置爲保留屬性。

@synthesize propertyName; 
self.propertyName = [[NSString alloc] initWithFormat:@"I just created %@", @"a leak"] 

現在,我們已經創建了一個NSString對象,並將其設置爲propertyName屬性,它本身是保留變量。現在該對象被雙重保留,並且不會被正確釋放。

當你用下劃線正確命名你的ivars時,這兩個問題都很容易解決(即使疲勞,儘管不那麼如此)。這不是一種防止欺騙的方法,但它使管理頭腦中對象的保留計數變得相當容易。

+0

哇!第二個問題很好的解釋。 –

+0

使用下劃線進行調試以及在查找/替換中查找訪問器用法的特定情況非常安全 – petershine