Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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
Iphone NSMutableArray访问器返回NSArray_Iphone_Objective C_Nsmutablearray - Fatal编程技术网

Iphone NSMutableArray访问器返回NSArray

Iphone NSMutableArray访问器返回NSArray,iphone,objective-c,nsmutablearray,Iphone,Objective C,Nsmutablearray,我有一个NSMutableArray @property (copy, nonatomic) NSMutableArray *childrenArray; 现在我初始化它如下: self.childrenArray = [NSMutableArray arrayWithArray:children]; 儿童在上面也是可以改变的 现在,当我从子数组中删除对象时,出现以下错误: [__NSArrayI removeObjectAtIndex:]: unrecognized selector se

我有一个NSMutableArray

@property (copy, nonatomic) NSMutableArray *childrenArray;
现在我初始化它如下:

self.childrenArray = [NSMutableArray arrayWithArray:children];
儿童在上面也是可以改变的

现在,当我从子数组中删除对象时,出现以下错误:

[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent
我立即明白我的remove是在NSArray上调用的,所以我的问题是为什么我的访问器返回NSArray,因为它应该返回NSMutableArray


谢谢,

首先,
copy
@属性会将
copy
发送到正在设置的对象。可变集合通过创建不可变副本来响应
copy
。可变复制充斥着边缘案例(其中许多已经在其他SO问题中讨论过)

其次,您确实不希望属性提供对对象内可变状态的访问。您可能不想出售可变集合类


直截了当的:

copy
发送到可变集合将返回不可变副本。
copy
属性不会保留可变性

手动实现setter/getter来设置/返回可变实例可能是错误的


这样想:

您有一个名为“Person”的类,该类的属性名为“firstName”。如果该属性是可变的,有人可能会说:

 [[aPerson firstName] setString:@"Joe"];

也就是说,您是否希望某人能够在不发出任何通知的情况下更改您的名字?可能不会。但这正是通过在可变容器中公开对象状态所允许的。

您好,谢谢,很抱歉我无法理解您的意思,您能否更简单地解释一下,如果复制有问题,那么我是否应该使用retain?您好,在反复阅读您的答案之后,我所理解的是:首先,我不是手动实现的setter和getter,synthesis正在做所有事情,所以这意味着当我用setter初始化可变数组时,它调用copy,而copy不保留可变性,所以访问器返回immutable。其次,我需要的是直接在member上初始化,而不是像这样的self.member childrenArray=[[NSMutableArray arrayWithArray:children]retain];(如果我仍然错了,请纠正我)。ThanksI还认为我应该使用retain semantic而不是copy,因为copy返回的是不可变的。谢谢。
retain
会起作用的,是的,但是——总的来说——您不想将实例内部的可变集合公开给外部世界。它破坏了封装。