Iphone 从NSMutableArray中删除对象时崩溃

Iphone 从NSMutableArray中删除对象时崩溃,iphone,ios,objective-c,nsmutablearray,removeall,Iphone,Ios,Objective C,Nsmutablearray,Removeall,在我的iphone项目(ARC启用)中,我有一个nsmuatble数组,其中包含大约5个托管对象(从核心数据中检索),在某些情况下,我需要从该nsmutablearray 我使用了以下方法删除对象,但在崩溃日志-[\uu NSArrayI removeObject:]:未识别的选择器发送到实例0xa391640 if (surveys && [surveys count]>0) { [surveys removeAllObjects

在我的iphone项目(ARC启用)中,我有一个
nsmuatble
数组,其中包含大约5个托管对象(从核心数据中检索),在某些情况下,我需要从该
nsmutablearray

我使用了以下方法删除对象,但在崩溃日志
-[\uu NSArrayI removeObject:]:未识别的选择器发送到实例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];
        }

有人能告诉我如何清空该数组吗?如果有任何建议,我们将不胜感激

[__NSArrayI removeObject:]: unrecognized selector
__NSArrayI是一个不可变数组(NSArray)的码字,这意味着您的调查对象是而不是NSMutablArray,而是NSArray

无法从
NSArray
添加或删除对象


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

删除您正在执行的所有操作,然后按此方式执行

 [surveys removeAllObjects];
NSMutableArray* surveys = [someManagedObjectContext executeFetchRequest:request]
由于您得到的错误,所以可能该数组不是NSmutableArray,只是普通数组,所以您无法从中删除对象,您尝试删除对象,但应用程序崩溃

如果它是可变的或不可变的,请检查您初始化它的位置

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

[__NSArrayI removeObject:] : unrecognized selector sent to instance 0xa391640
指示数组“surveys”是NSArray(不可变)。您确定已正确初始化它吗?如果你通过这样的作业来做

 [surveys removeAllObjects];
NSMutableArray* surveys = [someManagedObjectContext executeFetchRequest:request]

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

答案很简单

对于第一种情况。
检查初始化数组的部分,并检查代码中是否有指定NSArray给NSMutableArray对象的地方

第二种情况。

在数组中枚举时,不能从数组中删除对象。这将导致一个崩溃,即在枚举异常时,
数组发生了变化。很明显,在某个时刻,您正在为可变数组分配一个不可变的实例。从评论中,我可以看出您正在排序
调查
,排序数组返回的是不可变数组。类型转换对于获取不可变对象的mutableCopy没有好处

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,nil]; 
surveys = (NSMutableArray *) [[[NSMutableArray alloc]initWithArray:surveys ] sortedArrayUsingDescriptors:sortDescriptors];
而不是使用它

[surveys sortUsingDescriptors: @[sortDescriptor1]];

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


NSMutableArray*newArray=[NSMutableArray数组WithArray:oldArray]

在哪里声明和初始化调查?从崩溃日志来看,它似乎是一个NSArray而不是NSMutableArray。如果要用另一个数组替换它,为什么要从数组中删除所有对象?只需释放数组,然后创建一个新数组。@vcsjones我在启用ARC的环境中,如何释放对象?@RaviKiran那么您不必显式地释放它,只需设置一个新数组。您可能希望了解ARC,它对您有何帮助。NSMutableArray的removeObject与释放对象无关。我已经尝试过,,,它通过引发异常而崩溃[\uu NSArrayI removeObject:]:发送到实例0xA391640的无法识别的选择器如果要在NSArray中添加在NSMutableArray中找到的对象,只需在NSArray中执行for循环,并将其逐个添加到NSMutableArray中。这样,您就可以移除NSMutableArray中的AllObject。不要直接将您的NSArray分配给该NSMutableArray,因为这会使它成为一个不再可变的数组;调查=(NSMutableArray*)[[[NSMutableArray alloc]initWithArray:surveys]使用描述符:排序描述符进行排序;我想这就是问题的原因,,,我如何解决这个问题?@RaviKiran如果你调查的是一个可变数组
[surveys sortUsingDescriptors:sortDescriptors]可以。@RaviKiran我已经给出了优化排序的答案:)`surveys=(NSMutableArray*)[[[NSMutableArray alloc]initWithArray:surveys]SortDarray使用描述符:sortDescriptors];`在这行,虽然你已经打字了。内存位置的对象是NSArray对象。我不应该这么做。答案很简单,谢谢!在我的例子中,我分配
NSArray*newArray=someArray.copy
而不是
NSArray*newArray=someArray.mutableCopy