我有点困惑,因为在一些教程中只是
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;
哪种方式正确?
答案 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;
}