如果您有一个变量,有两种方法可以读取和设置属性(通常是ivar和accessor方法的组合)。旧的方式(有些还是首选)是直接使用存取方法:
//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's book副本。它详细解释了Cocoa和Objective-C。
编辑:我认为这里的一些混淆是术语。在Objective-C中,大多数对象都有实际存储数据的实例变量(ivars)。但是,一般而言,您希望避免直接访问ivars,特别是其他对象。 (这是面向对象设计的原则,是不是真的具体到Objective-C的。)
造成这种情况的主要原因是为了增加灵活性 - 如果我有一类Person
具有可变age
一个实例例如,我可能想在未来改变我的实现来动态确定年龄。如果其他类依赖实例变量age
,则实现更改时它们将中断。
解决此问题的方法是使用访问器,这是访问伊娃的方法。在Objective-C中,“getters”获取变量,并且通常将其命名为与变量相同的东西(因此在Person
示例中,获取器将为-(int)age
),“setters”设置该变量(它将被命名为-(void)setAge:(int)theAge
)。如果你使用访问器,你可以在将来自由地改变你的实现,甚至在必要时彻底摆脱伊娃,而不需要依赖班级。
在Objective-C中,ivar和accessors的组合通常被称为“属性”(尽管如果该值是动态创建的,则不一定必须是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。如果你是一个纯粹主义者,除了访问者,init
和dealloc
(以及后两者都有争议),你甚至不应该直接访问同一班级的ivars。
谢谢你的回复。这实际上令人困惑,我目前正试图通过阅读Apple提供的“C语言程序设计语言”这本书来解决这个问题,但是应该根据它们避免使用公共变量。 然后,正确的方法是什么? 一个viewcontroller负责获取用户输入,然后确定要分配给整数变量的数字。 之后,显示另一个视图控制器,该视图控制器正在寻找这个数字。如何将1 .m文件中创建的简单值传递给另一个.m文件?它感觉很简单,但该死的难度 – BittenApple 2010-05-21 18:12:04
(查看更新回答) – shosti 2010-05-21 19:07:58
非常感谢你回答我的问题。我不知道你为什么花了这么多精力写出这样详细的解释。像你这样愿意帮助的人现在很难遇到。再一次感谢你。 – BittenApple 2010-05-21 21:40:25