从 NSMutableArray 中删除对象时崩溃

Posted

技术标签:

【中文标题】从 NSMutableArray 中删除对象时崩溃【英文标题】:crash while removing objects from NSMutableArray 【发布时间】:2013-05-05 04:46:47 【问题描述】:

在我的 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提前

【问题讨论】:

调查在哪里声明和初始化?从崩溃日志来看,它看起来像是一个 NSArray 而不是 NSMutableArray。 如果您只想用不同的数组替换它,为什么要从数组中删除所有对象?只需释放数组,然后创建一个新数组。 @vcsjones 我在启用 ARC 的环境中,如何释放对象? @RaviKiran 那你就不用显式释放了,设置一个新数组就好了。 您可能想了解 ARC,以及它对您有什么作用。 NSMutableArray 的 removeObject 与释放对象无关。 【参考方案1】:

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

NSMutableArray *newArray = [NSMutableArray arrayWithArray: oldArray];

【讨论】:

【参考方案2】:

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

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

而不是它使用

[surveys sortUsingDescriptors: @[sortDescriptor1]];

【讨论】:

【参考方案3】:

错误信息说明了一切,

[__NSArrayI removeObject:]: unrecognized selector

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

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

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

【讨论】:

我已经尝试过了,它通过抛出异常 [__NSArrayI removeObject:]: unrecognized selector sent to instance 0xa391640 来崩溃 如果你想在你的 NSMutableArray 中添加在 NSArray 中找到的对象,只需在 NSArray 中执行一个 for 循环并将其一一添加到你的 NSMutableArray 中。这样,您可以在 NSMutableArray 中删除所有对象。不要直接将你的 NSArray 分配给那个 NSMutableArray ,因为这使它成为一个不再可变的数组。【参考方案4】:

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

 [surveys removeAllObjects];

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

如果它是可变的,检查你在哪里初始化它

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

【讨论】:

【参考方案5】:

答案很简单。

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

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

【讨论】:

你在一个地方分配 NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,nil];调查 = (NSMutableArray *) [[[NSMutableArray alloc]initWithArray:surveys ] sortedArrayUsingDescriptors:sortDescriptors];我想这是导致这个问题的原因,我该如何解决这个问题? @RaviKiran 如果你调查的是 mutableArray [surveys sortUsingDescriptors:sortDescriptors]; 会很好。 @RaviKiran 我已经给出了优化排序的答案:) `surveys = (NSMutableArray *) [[[NSMutableArray alloc]initWithArray:surveys ] sortedArrayUsingDescriptors:sortDescriptors];` 在这一行中,尽管您已经进行了类型转换。内存位置的对象是一个 NSArray 对象。永远不应该那样做。 答案真的很简单,谢谢!就我而言,我分配的是 NSArray *newArray = someArray.copy; 而不是 NSArray *newArray = someArray.mutableCopy;【参考方案6】:

这个:

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

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

NSMutableArray* surveys = [someManagedObjectContext executeFetchRequest:request]

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

【讨论】:

以上是关于从 NSMutableArray 中删除对象时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

通过 UITableView 从 NSMutableArray 中删除项目

从 NSMutableArray xcode 中删除对象

NSMutableArray removeObjectAtIndex 在第二次执行时崩溃

按键从 NSMutableArray 中删除对象

如何从 NSMutableArray 中删除对象?

如何从 NSMutableArray 中删除 nil 对象?