2010-05-21 56 views
0

我正在修改QuartzDemo示例应用程序,并希望在其他已经包含的类中设置和读取整数类型变量的值。如何设置和访问另一个类的变量值

例如,在MainViewController.m中,我想将一个数值(从1-100的简单数字)设置为一个变量,然后该变量将在QuartzImages.m文件中调用(读取)。

问题是如何正确定义变量,设置和访问(读取)值。

我所有与obj C和iPhone SDK一般初学者和有Delphi和VB的一些经验,但是这并不能在所有帮助:)

谢谢谁,无论你在哪里,人谁都会带我离开这无尽的谷歌搜索循环。

回答

1

如果您有一个变量,有两种方法可以读取和设置属性(通常是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。如果你是一个纯粹主义者,除了访问者,initdealloc(以及后两者都有争议),你甚至不应该直接访问同一班级的ivars。

+0

谢谢你的回复。这实际上令人困惑,我目前正试图通过阅读Apple提供的“C语言程序设计语言”这本书来解决这个问题,但是应该根据它们避免使用公共变量。 然后,正确的方法是什么? 一个viewcontroller负责获取用户输入,然后确定要分配给整数变量的数字。 之后,显示另一个视图控制器,该视图控制器正在寻找这个数字。如何将1 .m文件中创建的简单值传递给另一个.m文件?它感觉很简单,但该死的难度 – BittenApple 2010-05-21 18:12:04

+0

(查看更新回答) – shosti 2010-05-21 19:07:58

+0

非常感谢你回答我的问题。我不知道你为什么花了这么多精力写出这样详细的解释。像你这样愿意帮助的人现在很难遇到。再一次感谢你。 – BittenApple 2010-05-21 21:40:25