2012-11-12 32 views
2

我有點迷惑,因爲在一些教程只是物業應與內VAR來@synthesize與否

在H

@property (readwrite,nonatomic) NSUInteger DirectProp; 

以米

@synthesize DirectProp; 

但是在其他的像這樣

in h

@interface MyClass : CCNode { 
    NSUInteger throuVarProp; 

} 
@property (readwrite,nonatomic) NSUInteger ThrouVarProp; 
以米

@synthesize ThrouVarProp = throuVarProp; 

哪條路是正確的方式

回答

1

在有一個參數:

@synthesize directProp; 

合成的getter/setter方法被稱爲同用於存儲該值的實例變量。這可能會讓人困惑。例如:

self.directProp = YES; 

[self setDirectProp:YES]; 

directProp = YES; 

都是有效的。

通過附加= ivar,您可以命名實例變量(慣例是使用一個前導下劃線),這是一個好主意,這樣你就不會感到困惑:

@synthesize directProp = _directProp; 


self.directProp = YES; 

[self setDirectProp:YES]; 

_directProp = YES; 

由於還提到,使用較新的運行時,您不需要在使用之前聲明實例變量,這也是一個壞主意,似乎是在那裏促進懶惰。你會後悔有一天使用這個功能...

+0

所以你說使用iVar是很好的做法,當我的類將被調用不止一次,但當我只用一次我的類,dealloc它,並再次分配/ init然後我可以通過這種方法? – BW4

+0

@BłażejWdowikowski我不確定我是否說過,但使用@synthesize directProp = _directProp;方法並聲明您的實例變量。 – trojanfoe

2

都正確...

不同的是書面的舊的和新的風格。

在Xcode中的最新版本中,你會看到即使synthesize不是必需的,它會自動採取的_yourIvarName

0

他們都是正確的。

有了:

@interface MyClass : CCNode { 
    NSUInteger throuVarProp; 

} 

您是說給該對象有一個實例變量NSUInteger那種編譯器。 這個如果在形式上是正確的,但是現在這個代碼是由Xcode和編譯器在你使用@property時自動生成的。

在實現中使用的@syntesize創建getter和setters:用於從「outside」訪問實例變量的特殊實例方法。

在過去的XCode(據我所知,從4.4)甚至@syntesize是自動生成,格式爲

@syntesize var = _var; 
0

較新的運行時並不需要你定義伊娃。事實上,他們甚至會爲您自動合成iVar。

// .h 
@property (…) Type name; 

,如果你寫了這將自動合成屬性:

// .m 
@synthesize name = _name; 

因此你甚至可以訪問底層的變量,我不會推薦,但因爲我認爲這是一種潛在的實現細節。

請注意,如果你重寫吸氣劑自動合成將不再發生:

// .m 
@synthesize lazyProperty = _lazyProperty; 
- (NSString *)lazyProperty { 
    if (!_lazyProperty) 
     _lazyProperty = @"Foobar"; 

    return _lazyProperty; 
}