Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 访问自定义对象中的NSMutableArray_Xcode_Cocoa_Nsmutablearray - Fatal编程技术网

Xcode 访问自定义对象中的NSMutableArray

Xcode 访问自定义对象中的NSMutableArray,xcode,cocoa,nsmutablearray,Xcode,Cocoa,Nsmutablearray,我敢肯定这是一个完全没有问题的问题。。。但事实上我以前从未处理过这种情况,所以我有点困惑 假设我有一个自定义对象,我称之为person,每个person对象都可以有一个“财产”数组,如果你愿意的话,这是一种库存。我会这样设置: interface person : NSObject { NSString *name; NSMutableArray *posessions; @property (copy) NSString *name; @property (copy) NSM

我敢肯定这是一个完全没有问题的问题。。。但事实上我以前从未处理过这种情况,所以我有点困惑

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

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

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

}
[aPerson setName:@"Bob"];
当然,我也会在实现文件中综合我的属性。。。现在,在我的实际控制器对象中,我将创建我的对象的一个实例(或者通常是一个实例数组,但在本例中,一个可以正常工作…),如下所示:

我知道要访问人员姓名,我可以这样打电话:

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

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

}
[aPerson setName:@"Bob"];
要检索该名称,我可以使用以下命令:

aVar = [aPerson name];
我一直想知道的是,我到底应该如何向person类中的NSMutableArray添加或检索对象?假设我想对NSMutable数组使用“count”方法

我做了一些尝试,例如:

[aPerson.posessions count];
[[aPerson posessions] count];
同样,要将对象添加到数组中,我经常使用:

[someArray addObject:anObject];
但这样的尝试并没有奏效:

[aPerson.posessions addObject:anObject];
在阅读了大量内容并搜索了web之后,我似乎无法确切地找到如何在自定义类中与这个NSMutableArray交互。我确信这是很明显的,我只是不太明白,它已经成为一种精神障碍

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

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

有人能告诉我这里应该使用的语法吗

*编辑*

我想我应该对这个问题补充一点澄清。我的自定义对象(在上面的示例中,我的person对象)基本上是数据库记录。我在项目中使用了多个数据库,例如:

Person—NSObject的自定义子类,包含多个NSString对象以及int和bool

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

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

我一直试图从控制器对象中直接访问personDatabase中包含的各个对象。我这样声明了另一个对象:

Person *activePerson;
然后,我的所有呼叫都会发送到当前活动的Person记录(当前从personDatabase中选择的记录),例如:

someOutput = [activePerson name];
等等


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

您已将“Occessions”属性指定为“copy”。因此,当您编写
aPerson.approperties
时,您将获得财产数组的副本。对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

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

当您说“这样的尝试没有成功”时,您的意思是它没有将其添加到数组中,还是它会出错?数组总是返回一个计数0,无论我尝试以何种方式操作它,所以它要么根本不添加对象,要么做了(我)完全意想不到的事情。我主要是想了解用于添加对象或从数组中读取对象的正确语法。我希望数组的“副本”应该返回1的计数,然后。。。在上面的示例中,count方法返回0,我认为这意味着没有对象被添加到数组中。在这种情况下,与其说它没有添加到数组的正确实例,不如说它没有向数组的任何实例添加对象。我想问题出在我的语法上。我没想过那样做。当然是一种干净的“面向对象”方法。我很肯定这会解决我的问题。这是我为这个项目定制的类中唯一包含的数组。每隔一个iVar都是一个非数组,所以到目前为止,我可以对所有内容使用访问器方法。每次调用aPerson.properties,都会得到另一个新副本(其中将包含0个对象)。[aPerson.addObject:obj];NSAssert(0==[aPerson.properties count]);啊。。我认为部分问题在于我从未使用过object.ivar设置。我总是对访问器方法[object ivar]使用方法调用。。。如果我理解正确,他们的行为会不同吗?person对象中的所有NSString对象也设置为(复制),我希望NSMutableArray的行为与person中的NSString对象相同……实际上字符串和数组的行为类似,它们在访问时都会被复制。但是,您正在以不同的方式使用它们—您正在尝试修改数组。如果您试图修改字符串,您将遇到同样的问题,即更改无法坚持。