2012-06-01 41 views
1

我敢肯定,这是一个完整的noob问题...但我其实从来没有过,所以我有点糊涂应对这种情况...访问一个NSMutableArray我的自定义对象的内部

比方说,我有一个自定义对象,我会称之为人,每个人物都可以拥有一系列“财产”,如果您愿意的话,可以是一种库存。我将它设置这样的:

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 Array使用“count”方法。

我已经做了一些尝试和错误与尝试,如:

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

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

[someArray addObject:anObject]; 

但尝试这样的没有工作:

[aPerson.posessions addObject:anObject]; 

在读了一堆和搜索网络后,我似乎无法找到准确如何在我的自定义类中与此NSMutableArray进行交互。我敢肯定这是明显的,我只是没有得到,它已成为一种心理障碍...

此外,我正确的综合NSMutableArray的访问器属性?如果是这样,setX和X似乎不是那么明显与NSMutableArray ...除非他们简单地将整个阵列复制到本地变量...

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

有人能让我对我应该在这里使用的语法有点?

*编辑*

我想我有点澄清添加到这个问题。我的自定义对象(在上面的例子中,我的人物对象)基本上是数据库记录。我在我的项目中使用了几个数据库,例如:

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

personDatabase - Person对象(设置和我的主控制器对象中控制)

所有set和get方法都是从“控制器”之称的数组。

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

someOutput = [activePerson name]; 

Person *activePerson; 

然后,我所有的电话都到当前活跃的人记录(目前从personDatabase选择的一个),例如发

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

+0

当你说“这样的尝试没有奏效”,你的意思是它没有将它添加到数组中,或者它得到一个错误? –

+0

无论我尝试如何操作它,数组总是返回0的计数,所以它要么根本不添加对象,要么完全是意想不到的(对我来说)。我主要试图理解用于添加对象或从数组读取对象的正确语法。 –

回答

2

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

但是,还有一个更大的问题。一个人拥有财产,但你如何存储他们是一个实现细节。当你将公共接口放入NSMutableArray时,你会过度地限制你的实现。你可能会得到更好的服务来改变沿行的人接口:

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

那么,如何实现这些占有方法取决于你使用一个数组,一组,链表,树,随你。

+0

我希望那么数组的'副本'应该返回1的计数然后...在上面的例子中,计数方法返回0,我认为这意味着没有对象被添加到数组中。在这种特殊情况下,它不会增加数组的正确实例,它不会增加一个对象给数组的任何实例。我在想这是我的语法问题。 –

+0

啊。没有想过这样做。当然是一种干净的“面向对象”方法。我很确定这会解决我的问题。这实际上是这个项目中我的任何自定义类中包含的唯一数组。其他每个iVar都是非数组,所以我已经能够使用accessor方法来完成这一切。 –

+0

*每次*你打电话aPerson.possessions你会得到另一个新的副本(其中将有0个对象)。 [aPerson.possessions addObject:obj]; NSAssert(0 == [aPerson.possessions count]); – GoZoner

相关问题