2013-10-03 103 views
0

從Xcode 4.4開始,具有默認的屬性綜合。它自動生成這樣的:是否需要readwrite屬性的@synthesize?

@synthesize name = _name; 

source

而且從source2

讀寫VS只讀確定合成屬性是否具有合成訪問者或不(讀寫具有setter和是默認的,只讀確實不)。

因此,我的結論是,@synthesize name = _name;不需要讀寫,但它需要只讀

然而,在蘋果的spritekit冒險碼(adventure code download link),APAAdventureScene.m:

「英雄」(讀寫)是合成在這個例子中。如果它不合成它會給出這個錯誤:使用未聲明的標識符'_heroes'

@synthesize需要爲readwrite屬性,我很困惑?

謝謝

@interface APAAdventureScene() <SKPhysicsContactDelegate> 
... 

@property (nonatomic, readwrite) NSMutableArray *heroes; // our fearless adventurers 

@property (nonatomic) NSMutableArray *goblinCaves;  // whence cometh goblins 

... 
@end 



@implementation APAAdventureScene 

@synthesize heroes = _heroes; 

- (id)initWithSize:(CGSize)size { 
... 
     _heroes = [[NSMutableArray alloc] init]; 

     _goblinCaves = [[NSMutableArray alloc] init]; 
... 
} 

- (void)updateWithTimeSinceLastUpdate:(CFTimeInterval)timeSinceLast { 

    // Update all players' heroes. 

    for (APAHeroCharacter *hero in self.heroes) { 

     [hero updateWithTimeSinceLastUpdate:timeSinceLast]; 

    } 

    // Update the caves (and in turn, their goblins). 

    for (APACave *cave in self.goblinCaves) { 

     [cave updateWithTimeSinceLastUpdate:timeSinceLast]; 

    } 

} 

@end 
+0

我可以知道投票的理由嗎? – user1872384

回答

2

@synthesize不需要什麼了,只要你使用的是現代的LLVM編譯器(目前1年以上的默認值)。

readwrite是默認值,所以這兩個屬性都是可讀/寫的。在發佈的代碼中沒有任何原因@synthesize行。

唯一的例外是,如果您明確提供readwrite屬性的「setter」和「getter」。然後,伊娃不會自動生成。對於readonly屬性,如果您提供明確的「getter」,則不會生成ivar。

+0

我同意此聲明「在發佈的代碼中,沒有理由使用@synthesize行。」但它給出了這個錯誤:使用未聲明的標識符'_heroes' – user1872384

+0

代碼是否有明確的「setter」和「getter」方法? – rmaddy

+0

不,它沒有任何明確的setter或getter方法。 – user1872384