从NSMutableArray中删除对象时崩溃

17

在我的 iPhone 项目中(启用了 ARC),我有一个包含5个托管对象(从 core data 中检索出来的)的 nsmuatble 数组,在某些情况下我需要从该 nsmutablearray 中删除所有对象。

我尝试使用以下方法删除对象,但两种情况都崩溃并显示如下崩溃日志:-[__NSArrayI removeObject:]: unrecognized selector sent to instance 0xa391640

if (surveys && [surveys count]>0)
        {

            [surveys removeAllObjects];
            surveys = [[NSMutableArray alloc]init];
        }

而且我也尝试过

if (surveys && [surveys count]>0)
        {
            for(Survey *obj_Survey in surveys)
            {
                [surveys removeObject:obj_Survey];
            }

            surveys = [[NSMutableArray alloc]init];
        }

有人能告诉我如何清空这个数组吗?任何建议都将不胜感激。谢谢!


1
调查(surveys)在哪里声明和初始化?从崩溃日志来看,它似乎是一个NSArray而不是NSMutableArray。 - Sean Kladek
2
如果你只是要用一个不同的数组替换它,为什么要把所有对象从数组中删除?只需释放该数组,然后创建一个新数组即可。 - vcsjones
@vcsjones 我在启用ARC的环境中,我该如何释放一个对象? - Ravi Kiran
@RaviKiran 如果你只是想设置一个新的数组,那么就不需要显式地释放它。 - vcsjones
你可能想要了解一下ARC,以及它对你有什么作用。NSMutableArray的removeObject方法与释放对象无关。 - John
我知道我们不需要显式地释放它。 - Ravi Kiran
6个回答

19
答案很简单。
对于第一种情况。 检查您初始化数组的部分,并检查是否在代码中的某个地方将NSArray分配给NSMutableArray对象。
对于第二种情况。 您不能在枚举数组时从中删除对象。这将导致崩溃,显示“数组在枚举时已发生变异”。

在这段代码中,我将NSArray *sortDescriptors赋值给一个变量,并使用它来对NSMutableArray *surveys进行排序。但是,我认为这可能导致了一些问题。请问有什么解决方法吗? - Ravi Kiran
如果你的surveys是一个可变数组,那么[surveys sortUsingDescriptors:sortDescriptors];就可以了。 - Anupdas
@RaviKiran 我已经给出了一个优化排序的答案 :) - Anupdas
在这行代码中,虽然你进行了类型转换,但是内存位置上的对象是一个NSArray对象。不应该这样做。surveys = (NSMutableArray *) [[[NSMutableArray alloc]initWithArray:surveys ] sortedArrayUsingDescriptors:sortDescriptors]; - devluv
2
答案真的很简单,谢谢!在我的情况下,我分配了NSArray *newArray = someArray.copy;而不是NSArray *newArray = someArray.mutableCopy; - Karl White

9
这是:

[__NSArrayI removeObject:] : unrecognized selector sent to instance 0xa391640

这表示你的数组"surveys"是NSArray(不可变的)。你确定已经正确地初始化了它吗?如果你通过这样的赋值来完成它

NSMutableArray* surveys = [someManagedObjectContext executeFetchRequest:request]

一个名为“surveys”的数组将会是NSArray类型,因为Core Data获取请求返回的是NSArrays。


7
错误信息已经说得很清楚了,
[__NSArrayI removeObject:]: unrecognized selector

__NSArrayI是不可变数组(NSArray)的代码词,这意味着您的调查对象是NSArray而不是NSMutableArray

您不能从NSArray中添加或删除对象。

检查您的代码。您将NSArray分配给调查或将其重新初始化为NSArray


我已经尝试过了,但它会抛出异常[__NSArrayI removeObject:]: unrecognized selector sent to instance 0xa391640导致崩溃。 - Ravi Kiran
如果你想在一个NSArray中添加对象到NSMutableArray中,只需在NSArray中使用for循环,逐个将其添加到NSMutableArray中。这样,你就可以在NSMutableArray中使用removeAllObjects方法。不要直接将NSArray赋值给NSMutableArray,因为这会使它成为一个不可变的数组。 - jaytrixz

1

放下手头的所有事情,简单地按照以下方式操作

 [surveys removeAllObjects];

由于您收到的错误信息,可能该数组不是NSMutableArray而是普通数组,因此您无法从中删除对象,您尝试这样做并导致应用程序崩溃。请检查您初始化它的位置是否可变。所以正如我所说,移除所有内容并使用简单的removeAllObject即可。

0

从异常中可以明显看出,在某个时刻,您将一个不可变的实例分配给了可变数组。从评论中可以看出,您正在对 surveys 进行排序,而排序后的数组返回的是不可变数组。类型转换对于获取不可变对象的 mutableCopy 不起作用。

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,nil]; 
surveys = (NSMutableArray *) [[[NSMutableArray alloc]initWithArray:surveys ] sortedArrayUsingDescriptors:sortDescriptors];

不要使用它,改用

[surveys sortUsingDescriptors: @[sortDescriptor1]];

0
你可能已经使用了不可变数组进行初始化。 请使用以下代码:
NSMutableArray *newArray = [NSMutableArray arrayWithArray: oldArray];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接