2

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

在小时

@property (readwrite,nonatomic) NSUInteger DirectProp;

在米

@synthesize DirectProp;

但在其他是这样的

在小时

@interface MyClass : CCNode {
    NSUInteger throuVarProp;

}
@property (readwrite,nonatomic) NSUInteger ThrouVarProp;

在米

@synthesize ThrouVarProp = throuVarProp;

哪种方式是正确的方式?

4

4 回答 4

2

两个都对...

不同之处在于新旧的写作风格。

在最新版本的 Xcode 中,您会看到甚至synthesize不是必需的,它会自动作为 _yourIvarName

于 2012-11-12T09:10:00.480 回答
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;

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

于 2012-11-12T09:16:01.917 回答
0

他们都是对的。

和:

@interface MyClass : CCNode {
    NSUInteger throuVarProp;

}

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

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

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

@syntesize var = _var;
于 2012-11-12T09:13:19.583 回答
0

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

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

这将自动合成属性,就像您编写的一样:

// .m
@synthesize name = _name;

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

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

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

    return _lazyProperty;
}
于 2012-11-12T09:14:26.083 回答