0

我只是在链接中浏览属性文档:http: //developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html “您可以实现自定义访问器方法”部分描述属性并不总是必须由它们自己的实例变量支持。fullName 的例子也没有使用它自己的对应成员。

定义属性(_propertyName)时编译器不会隐式创建成员吗?

4

2 回答 2

0

如果您使用创建属性@property,则会自动创建一个 ivar,并且它的 setter 和 getter 由 LLVM 编译器创建。

而当你创建一个 ivar 时,你必须为它创建一个 setter/getter。通常,您使用@property并留在编译器上。

但是,在某些情况下,您会创建具有不同名称的 ivar 和属性,并将其引用为:

@synthesize boxDescription=boxName;

现在 boxName 是 boxDescription 的访问器,现在你不能boxDescription在你的代码中使用。

于 2013-02-26T14:27:34.000 回答
0

如果您覆盖默认的 setter 和 getter,并且您不提供 @synthesize(并且您也不访问 _ivar),则编译器不会为您创建任何变量。在这种情况下,您有一个不受 ivar 支持的属性。

作为一个非常随机的例子:

@property (nonatomic) int x;

- (int)x
{
  返回 1;
}

- (void)setX:(int)x
{
  NSLog(@"%d", x);
}

如果您有其他类的外观,并且您使用此 setter/getter 来设置/获取这些,则可以使用更有用的用法。

如果您不覆盖 set/getter 并且默认情况下 @synthesize 不再是强制性的,编译器会创建一个名为 _propertyname 的 ivar,您可以通过以下方式覆盖此行为@synthesize prop_name=ivar_name

于 2013-02-26T14:36:10.843 回答