17

在我的 iphone 项目(启用 ARC)中,我有一个nsmuatble数组,其中包含一些 5 个托管对象(从核心数据中检索),在某些情况下,我需要从中删除所有对象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];
        }

任何人都可以告诉我如何清空该数组,任何建议将不胜感激,thanx提前

4

6 回答 6

19

答案很简单。

对于第一种情况。
检查您初始化数组的部分,并检查您的代码是否在某处,如果您已将 NSArray 分配给您的 NSMutableArray 对象。

对于第二种情况。
枚举时不能从数组中删除对象。这将导致崩溃说array has mutated while enumerating

于 2013-05-10T13:36:22.150 回答
9

这:

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

表示您的数组“调查”是 NSArray(不可变)。你确定你已经正确初始化了吗?如果你通过这样的任务来做

NSMutableArray* surveys = [someManagedObjectContext executeFetchRequest:request]

数组“调查”将是 NSArray 类型,因为核心数据获取请求返回 NSArrays。

于 2013-05-10T13:29:54.847 回答
7

错误信息说明了一切,

[__NSArrayI removeObject:]: unrecognized selector

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

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

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

于 2013-05-10T13:24:00.017 回答
1

删除你正在做的所有事情,然后像这样简单地做

 [surveys removeAllObjects];

从你得到的错误来看,也许 Array 不是 NSmutableArray 只是普通数组,所以这就是为什么你不能从中删除对象并且你尝试这样做并且应用程序崩溃了

检查你在哪里初始化它是否是可变的

所以正如我所说,删除所有这些并使用简单的 removeAllObject

于 2013-05-10T13:28:26.250 回答
0

从异常中可以很明显地看出,在某些时候您正在将一个不可变实例分配给您的可变数组。从评论中我可以看出你正在排序 surveys并且排序数组返回不可变数组。类型转换对于获取不可变对象的 mutableCopy 没有好处。

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

而不是它使用

[surveys sortUsingDescriptors: @[sortDescriptor1]];
于 2013-05-10T14:08:44.467 回答
0

您可能已经使用不可变数组进行了初始化。使用以下代码:

NSMutableArray *newArray = [NSMutableArray arrayWithArray: oldArray];

于 2014-02-05T06:36:17.010 回答