Iphone NSMutableArray addObject:-[\uu NSArrayI addObject:]:发送到实例的选择器无法识别

Iphone NSMutableArray addObject:-[\uu NSArrayI addObject:]:发送到实例的选择器无法识别,iphone,nsmutablearray,Iphone,Nsmutablearray,从周日开始,我尝试了100次初始化NSMutableArray,但没有任何效果。我试着将它设置为一个新分配并初始化的NSMutableArray,只是分配,初始化变量本身,我能想到的每一个组合,总是相同的结果 代码如下: 对象.h NSMutableArray *array; @property (copy) NSMutableArray *array; 对象 @synthesize array; if ( self.array ) { [self.array addObject:

从周日开始,我尝试了100次初始化NSMutableArray,但没有任何效果。我试着将它设置为一个新分配并初始化的NSMutableArray,只是分配,初始化变量本身,我能想到的每一个组合,总是相同的结果

代码如下:

对象.h

NSMutableArray *array;

@property (copy) NSMutableArray *array;
对象

@synthesize array;

if ( self.array ) {
    [self.array addObject:anObject];
}
else {
    self.array = [NSMutableArray arrayWithObjects:anObject, nil];
}
注意:在调试中,执行时“anObject”不是nil

我已经测试了一个对象,它的初始化工作得很好,但是当我尝试将object:to self.array添加到中时,我不断得到下面的错误

2010-07-10 11:52:55.499 MyApp[4347:1807]-[\uu NSArrayI addObject:]:发送到实例0x184480的选择器无法识别

2010-07-10 11:52:55.508我的应用程序[4347:1807]***由于未捕获的异常而终止应用程序 “NSInvalidArgumentException”,原因:“-[\uu NSArrayI addObject:]:发送到实例0x184480的选择器无法识别”


有人知道出了什么问题吗?

属性(copy)的合成setter向数组发送一条
copy
消息,从而生成一个不可变的副本


您别无选择,只能自己在这里实现setter,如Objective-C指南中所示。

当我校对我的文章时,我想到了一个问题,我回答了自己的问题。这个决议太模糊了,我决定继续写下去,自己写这篇文章并回答它(这样,像我这样的新手就不会挂断电话了)

我的错误是

@property (copy) NSMutableArray *array;
应该是

@property (retain) NSMutableArray *array;
错误不是在我执行代码的方式中发生的,而是在anObject试图“复制”NSMutableArray的方式中发生的

我们都知道

mutableArray = [mutableArray copy];
不总是(或永远,在我的经验中)等于

mutableArray = [mutableArray mutableCopy];

这就是我问题的根源。通过简单地将@property从(copy)切换到(retain),我解决了我的问题。

我想向Georg Fritzsche致敬。我最终确实需要使用(复制)而不是(保留),如果没有他的输入,我不知道该怎么办

//@property (copy) NSMutableArray *array;
@property (nonatomic, copy) NSMutableArray *array; //overridden method is non-atomic as it is coded and should be reflected here.
如果您希望在可变对象上使用(复制),则必须重写“setter”方法,如下所示

- (void)setArray:(NSArray *)newArray {

    if ( array != newArray ) { 
        [array release];
        array = [newArray mutableCopy];
//      [array retain]; // unnecessary as noted by Georg Fritzsche
    }

    return;
}
注意:您将得到一个编译器警告:不兼容的Objective-C类型初始化“struct NSArray*”,预期为“struct NSMutableArray*”。我选择将newArray参数声明为(NSArray*),因为您可以灵活地将任何数组传递并正确复制到(NSMutableArray*)变量。如果希望将newArray参数声明为(NSMutableArray*),则仍然需要保留mutableCopy方法以获得所需的结果

为乔治干杯!
Z@K!

如果数组中的一个对象为空,则可能会发生此异常。

即使我的属性很强(使用ARC),并且我使用NSMUTABLEARRY分配了数组,我也会收到相同的错误

发生的事情是,我正在存档可变数组(因为它包含自定义对象)以备将来使用,在解码时,它返回一个不可变的副本

希望它能帮助任何人。

有一些索引(到其他地方的数据数组中),并且希望它们按数字顺序排列(这是一个很好的理由)。崩溃,直到在末尾添加了mutableCopy。完全困惑,直到我回忆起使用Objective-C literal@[]返回一个不可变数组

NSMutableArray *a = [@[@(self.indexA), @(self.indexB)] mutableCopy];
NSLog(@"%@", a);
[indexArray sortUsingComparator: ^(NSNumber *obj1, NSNumber *obj2) {
    return [obj1 compare:obj2];
}];
NSLog(@"%@", a);

桑克斯,扎克

我犯了一个打字错误,被这个例外咬了一口,也许这会节省某人5分钟的时间:

我写道:

NSMutableArray *names = [NSArray array];
而不是:

NSMutableArray *names = [NSMutableArray array];

编译器对此没有问题,因为NSMutableArray也是NSArray,但在尝试添加对象时会崩溃。

错误是由于尝试将对象添加到实际指向NSArray对象的NSMutableArray类型中。下面的一些演示代码显示了这种类型的场景:

NSString *test = @"test";
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
[mutableArray addObject:test];
NSArray *immutableArray = [[NSArray alloc] init];
mutableArray = immutableArray;
[mutableArray addObject:test]; // Exception: unrecognized selector

从上面的代码中,很容易看出子类类型被分配给了超类类型。例如,在Java中,这会立即被标记为错误(类型之间的转换错误),问题很快得到解决。公平地说,Objective-C在尝试执行不兼容的赋值时会发出警告,然而,有时这似乎是不够的,结果可能会给开发人员带来真正的痛苦。幸运的是,这一次,并不是我自己承受了大部分的痛苦:P

我有类似的错误说:无法识别的选择器被发送到NSMutable数组的实例。。在经历了很多事情之后,我发现我使用可变数组作为属性

@property(赋值,非原子)NSMutableArray*myMutableArray

在复制粘贴过程中,没有注意到这一点,导致了问题

解决方案告诉我们,我将其更改为强类型(您可以根据需要将其更改为任何其他类型,如强/弱等)。因此,我的解决方案是:

@property (strong, nonatomic) NSMutableArray *myMutableArray;

所以,复制粘贴时要小心!检查一次。

绝对正确!我在写我的帖子时意识到了这一点,我把我的决议贴在了下面。我没有真正考虑重写SETter,但在我的情况下,我并不需要一个拷贝,所以我的解决方案为我解决了。谢谢你的快速回复Z@K!指向Objective-C指南的链接已断开。请注意,属性声明不必与ivar类型匹配,因此应使用
@property(nonatomic,copy)NSArray*数组在您的情况下。还请注意,您的属性是隐式原子的,但setter的实现不是-请参见。最后,
-mutableCopy
已经返回保留的实例,因此不需要
[array retain]
-请参见。再次感谢您,Fritzsche先生。我对这个额外的保留很好奇,但它似乎在我的程序中起作用。显然我在其他地方有一个bug你就是那个人,谢谢你在这篇文章上的贡献,还有,inad