Iphone NSMutableArray访问器返回NSArray
我有一个NSMutableArrayIphone 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
@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
会起作用的,是的,但是——总的来说——您不想将实例内部的可变集合公开给外部世界。它破坏了封装。