我注意到在一些例子中,我看到你将设置一个引擎(类变量)为_engine(ivar)。我不明白。这里发生了什么?Objective C confusion - 将合成变量设置为ivars
这是我在说什么的例子: @synthesize引擎= _engine,委托= _delegate
我注意到在一些例子中,我看到你将设置一个引擎(类变量)为_engine(ivar)。我不明白。这里发生了什么?Objective C confusion - 将合成变量设置为ivars
这是我在说什么的例子: @synthesize引擎= _engine,委托= _delegate
这句法的属性映射到一个实例变量(伊娃)使用不同的名称。
所以:
@synthesize engine = _engine;
将创建一个访问,而不是发动机_engine伊娃属性访问方法。您仍然可以访问属性格式为:
object.engine
在Apple developer documentation on properties(部分财产公约实施指令)
如果伊娃的名称不完全合成的变种的名称相匹配,那么你更多信息需要将伊娃映射到变种。如果你喜欢用下划线给你的ivars加前缀,你可能想要这样做。
作者想确保直接访问伊娃和通过setter/getter访问之间没有混淆。如果名称相同,通常情况下,很容易写入: engine = 0而不是self.engine = 0;对于需要保留的ivar,如NSString,这可能会导致保留计数错误。
也有一个历史性的优先命名ivars与领先的“_”,“米”或“f”,所以他们wpuld很容易被视为伊娃。
@synthezise
关键字告诉Objective-C编译器为您的属性生成getter和setter方法。如果您已经定义:
@property(copy,nonatomic) NSString* name;
然后@synthesize name;
会为你创建这两种方法,让你不必为落实这些:
-(NSString*)name;
{
return name;
}
-(void)setName:(NSString*)newName;
{
if (name != newName) {
[name release];
name = [newValue copy];
}
}
默认情况下所使用的实例变量的名字因为合成属性的后备存储与属性命名相同。这并不总是你想要什么,然后你就可以合成为@synthesize name = _otherName;
告诉编译器,而不是为你生成这个代码:
-(NSString*)name;
{
return _otherName;
}
-(void)setName:(NSString*)newName;
{
if (_otherName != newName) {
[_otherName release];
_otherName = [newValue copy];
}
}
你平时前缀作为后备存储的性能的实例变量的原因带下划线的字符'_'是帮助你记住不要直接访问它们。
在你的设置者中,'name'和'_othername'应该是autoreleased,而不是定期发布。如果它们是传递参数newName的指针,那么它可能会过早地解除分配。 – dreamlax 2009-09-17 21:33:37
正确,我更新了示例以反映此情况,但未使用autorelease,因为这不是编译器所做的。 – PeyloW 2009-09-17 21:36:20
Autoreleasing比单纯的比较要贵很多,但我个人也是这么做的,因为没有特别的葡萄干。 – dreamlax 2009-09-17 23:40:43