我正在修改QuartzDemo示例应用程序,并想在其他类别中进行整数类型变量的设置和读取值。

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

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

我是OBJ C和iPhone SDK的初学者,并且在Delphi和VB方面有一定的经验,但这根本没有帮助:)

谢谢您,无论您身在何处,都会把我带出这个无尽的谷歌搜索循环。

有帮助吗?

解决方案

如果您有变量,则有两种方法可以读取和设置属性(通常是IVAR和访问者方法的组合)。旧方法(某些仍然是某些人的首选)是直接使用访问者方法:

//MYObject *obj, with int property foo
int i = [obj foo]
[obj setFoo:32]

新的方法是使用点syntax(仅适用于属性,不能与更复杂的方法一起使用):

int i = obj.foo //equivalent to [obj foo]
obj.foo = 32 //equivalent to [obj setFoo:32]

如果这使您感到困惑,我强烈建议您拿起一份 亚伦·希尔加斯的书. 。它详细说明了可可和Objective-C。

编辑: 我认为这里的一些混乱是术语。在Objective-C中,大多数对象都有实例变量(IVAR),实际上存储了数据。但是,通常您想避免直接访问IVAR,尤其是从其他对象中访问。 (这是面向对象设计的原则,并不是真正针对Objective-C的原则。)

这样做的主要原因是提高灵活性 - 如果我有课 Person 它具有实例变量 age, 例如,我可能希望将来更改我的实现,以动态确定年龄。如果其他类依赖实例变量 age, ,当实施变化时,它们将中断。

解决此问题的方法是使用访问者,该方法是控制访问IVAR的方法。在Objective-C中,“ Getters”获取变量,通常被称为与变量相同的东西(因此 Person 例如,getter将是 -(int)age)和“ setters”设置变量(将命名为 -(void)setAge:(int)theAge)。如果您使用访问者,将来可以自由地更改实施方式,甚至在必要时完全摆脱IVAR,而无需折断课程。

在Objective-C中,IVAR和配件的组合通常称为“属性”(尽管该值是动态创建的,但不必有IVAR)。如果您在属性方面思考,则不必担心其他类中的IVAR,而是他们实现的详细信息。 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。您应该很少(如果有的话)访问超类的IVAR。如果您是纯粹主义者,则您甚至不应该直接访问同一班级的IVAR init, , 和 dealloc (后两者受到辩论)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top