属性应该是@synthesize与内部var或不

时间:2012-11-12 09:01:48

标签: objective-c properties xcode4.5 synthesize

我有点困惑,因为在一些教程中只是

in h

@property (readwrite,nonatomic) NSUInteger DirectProp;

in m

@synthesize DirectProp;

但在其他方面是这样的

in h

@interface MyClass : CCNode {
    NSUInteger throuVarProp;

}
@property (readwrite,nonatomic) NSUInteger ThrouVarProp;

in m

@synthesize ThrouVarProp = throuVarProp;

哪种方式正确?

4 个答案:

答案 0 :(得分:2)

两者都是正确的......

区别在于较旧和较新的写作风格。

在Xcode的最新版本中,您将看到甚至不需要synthesize,它将自动显示为_yourIvarName

答案 1 :(得分: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;

如前所述,对于较新的运行时,您不需要在使用前声明实例变量,这也是一个坏主意,似乎是为了促进懒惰。你有一天会后悔使用这个功能......

答案 2 :(得分:0)

他们都是对的。

使用:

@interface MyClass : CCNode {
    NSUInteger throuVarProp;

}

您要对编译器说该对象具有NSUInteger类型的实例变量。 如果形式正确,但现在这个代码是由Xcode和编译器在使用@property时自动生成的。

实现中使用的@syntesize创建getter和setter:用于从“outside”访问实例变量的特殊实例方法。

在最后一个XCode(4.4中的AFAIK)中,甚至自动生成@syntesize,格式为

@syntesize var = _var;

答案 3 :(得分:0)

较新的运行时不需要您定义iVar。事实上,他们甚至会为你自动合成iVar。

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

这将自动合成属性,就像你写的那样:

// .m
@synthesize name = _name;

因此,您甚至可以访问基础变量,我不建议这样做,因为我认为它是一个底层实现细节。

请注意,如果覆盖getter,将不再发生自动合成:

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

    return _lazyProperty;
}