【问题标题】:Objective-C: Accessing Member Objects that are in an array?!? I thinkObjective-C:访问数组中的成员对象?!?我认为
【发布时间】:2010-07-11 16:33:55
【问题描述】:

完全是 Obj-C 的新手,感谢您的耐心等待。 :P

因为我是初学者,所以我将使用汽车示例。我更容易理解。

我有一个对象,汽车。它有两个成员对象,轮胎和引擎。

轮胎和引擎也有自己的成员变量,但它们只是具有各种名称(如压力、胎面深度)的 int。

在所有这些情况下,我都合成了访问器方法。我不确定对象的访问器方法,所以我只是做了@property id engine / @property id 轮胎。希望是对的!

现在,我可以使用 dot.notation 样式来访问:[car.engine cylinders]。美好的!发送轮胎和引擎信息工作正常。我写了方法,这个符号似乎有用。

但是当我声明一个对象数组时,比如汽车的 4 个轮胎:

@interface Car : NSObject {
     tire *tires[4];
}

我无法发送这样的消息

[car.tire[0] setPressure: int];

它说访问未知的轮胎吸气剂方法。

基本上我想知道是否有人可以帮助我了解如何正确访问数组中对象的成员变量。

谢谢!

【问题讨论】:

  • 为什么将它们定义为@property id?为什么不@property tire
  • 我认为没有定义“轮胎”类。因此,他使用 id 作为类型并在“Car”类中定义类型为“id”的 iVar“轮胎”。最好是创建一个轮胎对象或一个包含数组的轮胎对象,并将其设为“汽车”的属性。

标签: objective-c


【解决方案1】:

您正试图在 car 上调用一个不存在的 getter。无论如何,您都不能按值返回 C 样式的数组,因此在这种情况下,我宁愿使用 NSArray,而不是只返回 Tire* 指针:

// header:
@interface Car : NSObject {
    NSArray *tires;
}
@property (nonatomic, copy) tires;
// ...

// source:
@implementation Car
@synthesize tires;

- (id)init {
    if ((self = [super init])) {
        tires = [[NSArray alloc] initWithObjects:
                  [[[Tire alloc] init] autorelease],
                  // ...
                  nil];
        // ...
    }
    return self;
}

- (void)dealloc {
    [tires release]; // don't forget to clean up
    // ...
}

现在你可以使用getter了:

[[[car.tires] objectAtIndex:0] setPressure:0];

【讨论】:

    【解决方案2】:

    啊,好的。哎呀!

    需要编写一个索引访问器。这不是@synthesize 交易的一部分吗?天哪!

    :P

    【讨论】:

    • 请随意提交错误请求(它将作为欺骗返回,但仍然有用)。在@synthesize 中支持这一点非常困难。
    【解决方案3】:

    为什么不把你所有的tire 对象放到NSArrayNSSet 中呢?或者,由于您知道只有四个,您可以简单地定义 frontLeftTirefrontRightTire 等属性。

    【讨论】:

      【解决方案4】:

      你可以使用 Objective-C 风格的数组。然后你会有类似的东西:

      NSArray *tires = [NSArray arrayWithObjects: tire1, tire2, tire3, tire4];
      

      然后您将访问它们:

      [tires objectAtIndex:0];
      

      假设您使用的是所描述的合成方法。我不确定你的问题,但似乎你可能想为这些对象定义一个类“轮胎”(而不仅仅是一个方法,这是我在上面看到的),它继承自 NSObject,或者可能来自你自己类 CarPart 等。然后你在一个循环中分配 4 个轮胎并调用一个 init 方法来设置一些默认状态(希望比我车里的备用甜甜圈更好),然后将它们添加到“汽车”中的数组中初始化汽车时。

      【讨论】:

      • 感谢大家的回答。我让它工作,但我认为必须有一个更优雅的方式!我创建了轮胎的实例 4(记住,它们属于汽车),然后创建一个名为轮胎阵列(也属于汽车)的 NSArray,并使用 4 个轮胎对象进行初始化。合成getter方法,然后这样调用:[[car.tirearray objectAtIndex:0] pressure]; (这个方法只是返回轮胎的压力)它工作!所以这很酷。但是,如果您能想象出任何其他方式来做到这一点,我将非常感激!谢谢大家。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      相关资源
      最近更新 更多