2014-09-25 97 views
-3

我有一个@property (nonatomic,copy) NSMutableArray* children;,我正在向这个数组添加/删除项目。NSMutableArray removeObject:引发错误

这里的惊喜:

- (void)addChildDocument:(PPDocument *)doc { 
    [_children addObject:doc]; 
} 

- (void)removeChildDocument:(PPDocument*)doc { 

    [_children removeObject:doc]; 
} 

第一个工作正常。第二个不是。

-[__NSArrayI removeObject:]: unrecognized selector sent to instance 

能否请您给我解释不清楚是怎么回事,以及如何children阵列突然显示为不变


UPDATE:

的问题已得到解决。然而,尽管可能会引发你的奇怪,但大多数人提到的copy与这个问题无关。奇怪的是,它必须处理每个PPDocumentparent属性未被正确设置为weak。一旦我做到了(并且保持原样),一切正常 - 正如预期的那样。无论如何,NSMutableArray仍然是可变的。

+0

@Alladinian没有,它没有工作。而且,顺便说一句,你所说的看起来并不真实。如果'children'作为不可变对象返回,为什么addChildDocument'每次都工作? – 2014-09-25 14:39:55

+0

你可以分享阵列的初始化/分配吗?另外作为副本'copy'总是会让你成为一个不可变的实例,也许'strong'是更合适的选择。 – Alladinian 2014-09-25 14:40:23

+0

@ Dr.Kameleon是的,我意识到你直接访问伊娃并删除了第一条评论(除非你在某处使用'self.children',并重新分配)。 – Alladinian 2014-09-25 14:41:03

回答

-1

你必须做:

obj.children = @[ @"Some", @"immutable", @"array" ]; 
呼叫之间

-3

您无法删除您在该方法中添加的内容。你需要给他一个数组索引。

例如,

[_children removeObject:[_children lastObject]];

,如果你知道它会一直陪伴我的最后一个。

如果不是,请提供一个评论,更详细地解释对象的位置。

编辑:其实你可能可以做到以下几点,你也可以尝试吗?

[_children removeObjectAtIndex:[_children indexOfObject:doc]];

+2

这与问题无关。 – rmaddy 2014-09-25 14:41:48

+0

我刚试过'NSInteger ind = [_children indexOfObject:doc]; [_children removeObjectAtIndex:ind];'(这几乎与你所建议的一致,呵呵?),但它不起作用。 – 2014-09-25 14:42:39

+0

是啊,它几乎是一样的... 它是一样的错误? 因为你的数组的确显示为不可变的,即使你确实在一个可变的数组上工作。你有没有尝试过使用非复制数组? – 2014-09-25 15:00:49