【问题标题】:Accessing an NSMutableArray inside my custom object在我的自定义对象中访问 NSMutableArray
【发布时间】:2012-06-07 02:05:46
【问题描述】:

我确定这是一个完整的菜鸟问题...但实际上我以前从未处理过这种情况,所以我有点糊涂...

假设我有一个名为 person 的自定义对象,每个 person 对象都可以有一个“财产”数组,如果你愿意的话,这是一种库存。我会这样设置:

interface person : NSObject {
    NSString *name;
    NSMutableArray *posessions;

@property (copy) NSString *name;
@property (copy) NSMutableArray *posessions; // no idea if this is even necessary...

}

当然,我也会在实现文件中综合我的属性...现在,在我的实际控制器对象中,我会创建我的对象的一个​​实例(或者通常是一个实例数组,但对于这个例子,我们将工作正常...)这样:

person *aPerson;

我知道要访问人名,我可以这样调用:

[aPerson setName:@"Bob"];

要检索该名称,我可能会使用这个:

aVar = [aPerson name];

我坚持的是,我将如何向位于我的 person 类中的 NSMutableArray 添加或检索对象?假设我想对 NSMutable 数组使用“count”方法。

我已经尝试过一些尝试和错误,例如:

[aPerson.posessions count];
[[aPerson posessions] count];

同样,将对象添加到数组中,我经常使用:

[someArray addObject:anObject];

但是这样的尝试没有奏效:

[aPerson.posessions addObject:anObject];

在阅读了一堆并搜索了网络之后,我似乎无法在我的自定义类中确切地找到如何与这个 NSMutableArray 交互。我敢肯定,这很明显,我只是不太明白,而且它已经成为一种心理障碍......

另外,我在合成 NSMutableArray 的访问器属性时是否正确?如果是这样,setX 和 X 在 NSMutableArray 中似乎并不那么明显......除非它们只是将整个数组复制到一个局部变量中......

也许这是需要做的?使用访问器方法获取整个数组,将其放在局部变量中,进行更改,然后使用 set 访问器方法将整个数组放回我的 person 对象中?

有人可以告诉我我应该在这里使用的语法吗?

* 编辑 *

我想我会对这个问题做一些澄清。我的自定义对象(在上面的示例中,我的人员对象)基本上是数据库记录。我的项目中有几个数据库正在使用,例如:

Person - NSObject 的自定义子类,包含多个 NSString 对象,以及 Ints 和 BOOL。

personDatabase - Person 对象数组(在我的主 CONTROLLER 对象中设置和控制)

所有的 set 和 get 方法都是从“控制器”调用的。

我一直在尝试做的是从我的 Controller 对象中直接访问 personDatabase 中包含的各个对象。我通过这种方式声明另一个对象来做到这一点:

Person *activePerson;

然后,我所有的调用都是针对当前活动的 Person 记录(当前从 personDatabase 中选择的那个)进行的,例如:

someOutput = [activePerson name];

等等

有没有办法从我的 Controller 对象直接访问 activePerson 对象内的 NSMutableArray 对象内的对象?

【问题讨论】:

  • 当你说“这样的尝试没有奏效”时,你的意思是它没有将它添加到数组中,还是出现错误?
  • 无论我尝试以哪种方式操作它,数组始终返回计数 0,因此它要么根本不添加对象,要么正在做一些完全出乎我意料的事情(对我来说)。我主要是想了解用于添加对象或从数组中读取对象的正确语法。

标签: xcode cocoa nsmutablearray


【解决方案1】:

您已将 'possessions' 属性指定为 'copy'。因此,当您编写aPerson.possessions 时,您将获得一份财产数组的副本。对 addObject 的调用将一个对象添加到一个新数组中,该数组是 aPerson 的财产数组的副本。最简单的“修复”是将“复制”更改为“保留”(可能是“只读”)。 [编辑:错误;它是“分配时复制” - 而不是“读取时复制”]

但是,还有一个更大的问题。一个人拥有财产,但如何存储它们是一个实现细节。当您将 NSMutableArray 放在公共接口中时,您会过度限制您的实现。您最好按照以下方式更改 Person 界面:

@interface Person : NSObject {
@private
     NSString *name;
     // ...
  }
  - (Boolean) addPossession: (NSObject *) obj;
  - (Boolean) remPossession: (NSObject *) obj;
  - (Boolean) hasPossession: (NSObject *) obj;
  - (NSArray *) allPossessions;
@end

那么,你如何实现这些占有方法取决于你是使用数组、集合、链表、树还是任何东西。

【讨论】:

  • 我希望数组的“副本”应该返回 1 的计数然后......在上面的示例中,count 方法返回 0,我认为这意味着没有对象正在添加到数组中。在这种特殊情况下,与其说它没有添加到正确的数组实例中,不如说它没有将对象添加到数组的任何实例中。我认为这是我的语法问题。
  • 啊。没有想过要那样做。当然是一种干净的“面向对象”方法。我很确定这会解决我的问题。这实际上是该项目的任何自定义类中包含的唯一数组。其他所有 iVar 都是非数组,因此到目前为止,我已经能够对所有内容使用访问器方法。
  • 每次你调用 aPerson.possessions 你会得到另一个新副本(其中将有 0 个对象)。 [aPerson.possessions addObject: obj]; NSAssert (0 == [aPerson.possessions count]);
  • 啊.. 我认为部分问题是我从未使用过 object.ivar 设置。我总是将方法调用与访问器方法 [object ivar] 一起使用...如果我理解正确,它们的行为会有所不同吗? person 对象中的所有 NSString 对象也都设置为(复制),我希望 NSMutableArray 的行为方式与 Person 中的 NSString 对象相同...
  • 实际上字符串和数组的行为相似,它们在访问时都会被复制。但是,您使用它们的方式不同 - 您正在尝试修改数组。如果您尝试修改字符串,您将遇到同样的问题,即更改不会生效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多