如果你有一个变量,有两种方法可以读取和设置属性(通常是 ivar 和访问器方法的组合)。旧方法(仍然被某些人喜欢)是直接使用访问器方法:
//MYObject *obj, with int property foo
int i = [obj foo]
[obj setFoo:32]
新方法是使用点语法(仅适用于属性,不能与更复杂的方法一起使用):
int i = obj.foo //equivalent to [obj foo]
obj.foo = 32 //equivalent to [obj setFoo:32]
如果这让您感到困惑,我强烈建议您阅读 Aaron Hillegass 的书。它非常详细地解释了 Cocoa 和 Objective-C。
编辑:我认为这里的一些混淆与术语有关。在 Objective-C 中,大多数对象都有实例变量(ivars),它们实际上存储数据。但是,通常您希望避免直接访问 ivars,尤其是从其他对象。(这是面向对象设计的原则,并非真正特定于 Objective-C。)
这样做的主要原因是增加灵活性——例如,如果我有一个Person
具有实例变量的类age
,我可能希望将来更改我的实现以动态确定年龄。如果其他类依赖于实例变量age
,它们将在实现更改时中断。
解决这个问题的方法是使用访问器,它们是控制对 ivar 的访问的方法。在 Objective-C 中,“getter”获取变量,并且通常与变量命名相同(因此在Person
示例中,getter 为-(int)age
),“setters”设置变量(命名为-(void)setAge:(int)theAge
)。如果您使用访问器,您可以在未来自由更改您的实现,甚至在必要时完全摆脱 ivar,而不会破坏依赖类。
在 Objective-C 中,ivar 和访问器的组合通常称为“属性”(尽管如果值是动态创建的,则不一定必须是 ivar)。如果您从属性的角度考虑,则不必担心其他类中的 ivars——它们是实现细节。Objective-C 2.0 有一些很好的语法糖来创建属性:
//Person.h
@interface Person : NSObject {
int age;
}
@property (assign) int age; //declares the accessors
@end
//Person.m
@implementation Person
@synthesize age; //implements -(int)age and -(void)setAge:theAge
@end
要记住的重要一点是,大多数时候,您应该考虑属性而不是 ivars。您永远不应该直接访问其他类中的 ivars。您应该很少(如果有的话)访问超类中的 ivars。如果你是一个纯粹主义者,你甚至不应该直接访问同一个类中的 ivars,除了访问器、、init
和dealloc
(后两者有争议)。