1

我敢肯定这是一个完整的菜鸟问题……但实际上我以前从未处理过这种情况,所以我有点困惑……

假设我有一个名为 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 数组使用“计数”方法。

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

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

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

[someArray addObject:anObject];

但这样的尝试没有奏效:

[aPerson.posessions addObject:anObject];

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

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

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

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

* 编辑 *

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

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

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

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

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

Person *activePerson;

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

someOutput = [activePerson name];

等等

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

4

1 回答 1

2

您已将 '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

然后,如何实现这些拥有方法取决于您是否使用数组、集合、链表、树或任何东西。

于 2012-06-01T22:53:18.810 回答