我确信这是一个完整的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对象内的对象?
答案 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
然后,你如何实现这些拥有方法取决于你是否使用数组,集合,链表,树,等等。