1

当您声明 a@property@synthesizeit 时,最好使用:

@synthesize myProperty = _myProperty;

我注意到 Xcode 会_myProperty为您自动完成 ivar 名称,即使它尚未在源代码中使用。

这是因为 ivar@synthesize会自动创建默认名称_myProperty吗?还是仅仅因为 Xcode 支持这种带有自动补全功能的通用约定?

谢谢。

编辑:我不是在寻找为什么这是一种好习惯的原因;我已经知道这些并且已经使用了这个约定一段时间了。我想了解内部结构,因此询问这是否是满足约定的硬编码自动完成规则,或者它是否是标准自动完成,实际上 Objective-C 规范规定生成的 ivar@synthesize必须具有form _myProperty,因此在 ivar 的幕后生成之后,自动完成就知道它的存在。谢谢!

4

4 回答 4

2

我认为自动完成是 IDE 的便利,而不是运行时的结果。我对此的逻辑是以下似乎是有效的:

@interface SomeClass()
@property (nonatomic, assign) int unpublishedInstanceVariable;
@end

@implementation SomeClass
@synthesize unpublishedInstanceVariable;

- (void)someMethod
{
    unpublishedInstanceVariable = 3; // not calling the setter
}
@end
于 2011-10-12T14:29:59.567 回答
1

硬编码的自动完成规则以满足约定

如果您没有明确指定 iVar 名称,它将被称为myProperty. 自动完成与编译器没有任何关系,只是 Xcode 更有帮助。

于 2011-10-12T14:29:15.213 回答
1

从 Xcode 4.4 开始,尾部有了新的变化(原文如此)。

  • 我们现在可以@synthesize完全跳过。在这种情况下,编译器会自动@synthesize foo = _foo;为我们生成声明,实例变量名称带有下划线前缀。

@interface Foo : NSObject
@property (nonatomic, copy) NSString *foo;
@end

@implementation Foo
- (void)bar {
    NSLog(@"%@", _foo); // this Works!
}   
@end
  • 但是,如果我们确实有明确的@synthesize声明但没有指定实例变量的名称,那么实例变量的默认名称与属性的名称相同,即不带下划线前缀,在这种情况下@Tommy 的回答仍然持有。

如果有人能指出记录此行为的官方 Apple Docs 的链接,那就太好了。

更新

我的发现是正确的。这种行为(@synthesize作为默认行为,并在没有显式合成等的情况下创建支持下划线前缀的实例变量等)在WWDC 2012 Session 405 - Modern Objective-C中公开宣布。

于 2012-09-04T04:38:35.327 回答
0

wrt你问题的这一部分:

是否……事实上,Objective-C 规范规定 @synthesize 生成的 ivar 必须具有 _myProperty 形式,

您可以为您的 ivar 命名任何您想要的名称。从文档:

您可以使用 property=ivar 的形式来指示应该为属性使用特定的实例变量,例如:

@synthesize firstName, lastName, age=yearsOld; 

这指定了 firstName、lastName 和 age 的访问器方法应该被合成,并且属性 age 由实例变量 yearsOld 表示。

还,

如果没有另外声明,@synthesize 指令还会合成适当的实例变量。

于 2012-09-04T17:36:44.497 回答