我刚刚浏览了链接中的属性文档:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html “您可以实现自定义访问器方法”一节描述了属性并不总是必须由它们自己的实例变量支持。 fullName的示例也不使用其自己的相应成员。
在定义属性时,编译器是否会隐式创建成员(_propertyName)?
答案 0 :(得分:0)
如果使用@property
创建属性,则会自动创建ivar,其setter和getter由LLVM编译器创建。
当你创建一个ivar时,你必须为它创建一个setter / getter。通常,您使用@property
并在编译器上休息。
但是在某些情况下,您可以创建具有不同名称的ivar和属性,并将其引用为:
@synthesize boxDescription=boxName;
现在boxName是boxDescription的访问者,现在您无法在代码中使用boxDescription
。
答案 1 :(得分:0)
如果覆盖默认的setter和getter,并且你没有提供@synthesize(并且你也不能访问_ivar),编译器不会为你创建变量。在这种情况下,你有一个没有ivar支持的属性。
作为一个非常随机的例子:
@property (nonatomic) int x; - (int)x { return 1; } - (void)setX:(int)x { NSLog(@"%d", x); }
如果你有其他类的外观,你可以使用这个setter / getter来设置/获取那些更多用户满意的用法。
如果你没有覆盖set / getter,现在@synthesize不再是强制性的,默认情况下编译器创建一个名为_propertyname的ivar,你可以通过@synthesize prop_name=ivar_name
覆盖这个行为