2013-03-02 43 views
5

在Xcode 4.4之前的大多數項目中,我意識到開發者同時聲明瞭一個ivar和一個同名的屬性。示例爲什麼需要申報伊爾和同名的財產?

@interface SecondViewController : UIViewController 
{ 
    NSString *string; 
} 

@property (strong, retain) NSString *string; 

所以我不知道爲什麼?

+1

DUP:http://stackoverflow.com/questions/5555736/objective-c-why-do-we-declare-ivars-in-the-h-member-area- if-property-looks- – justin 2013-03-02 10:43:18

回答

1

我不能說別人,但我不使用同一個名字。如果我確實聲明瞭一個實例變量,則它帶有一個前導下劃線,所以很明顯,如果我指的是實例變量或setter/getter方法。

使用Xcode 4.4+,您不需要聲明實例變量或調用@synthesize,編譯器將自動創建一個具有前導下劃線的實例變量,併爲您提供setter/getter方法。

但是,我不認爲這種機制是一個非常好的主意,因爲它鼓勵開發人員暴露不應該暴露的類的屬性。

例如,這是從開始的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 

任何使用類將打破這種模式的一個艱難的時期。

但是這當然是更多的思考和打字開發人員,所以蘋果已經推出了新功能,以便他們能夠在更短的時間內完成他們想要完成的任務(當您只需將插座拖到頭文件,併爲您提供聲明和實現框架)。

+0

「,所以很明顯,如果我指的是實例變量或setter/getter方法」 - 無論如何這很明顯:'self.foo'是一個屬性,'foo'是一個ivar。 – 2013-03-02 09:31:26

+0

@ H2CO3這是一個容易犯的錯誤,錯過了「自我」位...... – trojanfoe 2013-03-02 09:32:06

+0

正如你可以在這篇文章中看到: http://inessential.com/2010/06/28/how_i_manage_memory 作者使用伊娃和一個同名的財產。我不明白他的意圖。 – Proton 2013-03-02 09:35:34

7

只是一個風格問題,習慣於從過去的編譯器的行爲。

現在在新的編譯器中,這不是必需的。只要你創建一個屬性,在場景後面創建一個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 
+0

這是正確答案,+1。這不是Xcode版本的問題,它是語言方言版本的問題,它是在某個版本的編譯器中實現的。 – 2013-03-02 09:30:56

+0

@ H2CO3:謝謝,每當你給我+1,我覺得好:) – 2013-03-02 09:35:41

+0

這條線的意義'@synthesize smallString = bigString;' – Proton 2013-03-02 09:50:03