readwrite属性需要@synthesize吗?

时间:2013-10-03 05:27:34

标签: ios objective-c properties synthesize

从Xcode 4.4开始,默认合成属性。它会自动生成:

  @synthesize name = _name;

source

来自source2

readwrite vs readonly确定合成属性是否具有合成访问器(readwrite具有setter并且是默认值,readonly不是)。

因此,我得出结论,readwrite不需要@synthesize name = _name;,但只读它需要

但是,在Apple的spritekit冒险代码(adventure code download link)中,APAAdventureScene.m:

“heroes”(readwrite)是在示例中合成的。如果它没有合成,它将给出这个错误:使用未声明的标识符'_heroes'

readwrite属性是否需要@synthesize,我很困惑?

谢谢

 @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

1 个答案:

答案 0 :(得分:2)

只要您使用的是现代LLVM编译器(默认值超过1年),

@synthesize就不再需要了。

readwrite是默认值,因此两个属性都是可读/写的。发布的代码中没有@synthesize行的原因。

唯一的例外是,如果您为readwrite属性明确提供“setter”和“getter”。然后不会自动生成ivar。对于readonly属性,如果您提供明确的“getter”,则不会生成ivar。