在我的自定义对象中访问NSMutableArray

时间:2012-06-01 20:28:25

标签: xcode cocoa nsmutablearray

我确信这是一个完整的Noob问题......但我实际上从来没有处理过这种情况,所以我有点糊涂......

假设我有一个我称之为人的自定义对象,每个人对象都可以拥有一系列“所有权”,如果你愿意的话,还有一种库存。我会这样设置:

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];

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

我尝试过一些尝试和错误:

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

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

[someArray addObject:anObject];

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

[aPerson.posessions addObject:anObject];

在阅读了一堆并在网上搜索之后,我似乎无法确切地找到如何在我的自定义类中与此NSMutableArray进行交互。我确信这是显而易见的,我只是不太明白,而且它已成为一种精神障碍......

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

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

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

*编辑*

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

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

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

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

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

Person *activePerson;

然后,我的所有调用都发送到当前活动的Person记录(当前从personDatabase中选择的记录),例如:

someOutput = [activePerson name];

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

1 个答案:

答案 0 :(得分:2)

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

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

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

然后,你如何实现这些拥有方法取决于你是否使用数组,集合,链表,树,等等。