发送到 nsmutablearray 中的不可变对象的变异方法

mutating method sent to immutable object' in nsmutablearray

我想从 NSmutableArray 中删除对象,谁能告诉我从 NSMutableArray 中删除对象的最佳方法

.h

@property(nonatomic,retain)NSMutableArray *arr_property;

.m

_arr_property=[[NSMutableArray alloc]init];
MTPop *lplv = [[MTPop alloc] initWithTitle:SelectProperty(APP_SHARE.language)
                                   options:[_arr_property valueForKeyPath:@"property_list.property_type_name"] 
                                   handler:^(NSInteger anIndex) {
    txt_Property.text=[[_arr_property valueForKeyPath:@"property_list.property_type_name"] objectAtIndex:anIndex];
    NSLog(@"index number %ld",(long)anIndex);

删除对象--->>>

NSLog(@"index number %@",[_arr_property valueForKey:@"property_list"]);
[[_arr_property valueForKeyPath:@"property_list.property_type_name"] removeObjectAtIndex:anIndex];  ////hear the app is crashing

应用程序崩溃我得到的错误是

2015-06-09 13:21:31.104 Estater[2170:62264] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object'

想想你的代码:

_arr_property=[[NSMutableArray alloc]init];

你现在有一个 NSMutableArray。它有没有个元素。

[... removeObjectAtIndex:0];

我们刚刚说了什么?该数组有 没有 个元素。它有 no 元素 0 - 要有一个元素 0,它至少需要有 one 元素,但事实并非如此。没有什么可以删除的。

[_arr_property valueForKeyPath:@"property_list.property_type_name"]

那部分是最奇怪的,但让我们继续。当在数组上调用时,valueForKeyPath: 会产生一个 NSArray,而不是 NSMutableArray。所以这会给你一个 空的 NSArray。但是你不能对 NSArray 说 removeObjectAtIndex:,即使它是空的——它是不可变的。这就是您遇到的崩溃。

真正的错误是您在 NSMutableArray 的 元素 上调用 removeObject:

[-->[_arr_property valueForKeyPath:@"property_list.property_type_name"]<-- removeObjectAtIndex:0]; 

数组看起来是空的,但如果有东西填充,要删除第一个元素,您应该改为:

[_arr_property removeObjectAtIndex:0];

首先,您不能使用 NSMutableArray 不支持的键值编码。您必须更好地使用 NSMutableDictionary 。 字典根据键存储对象,而数组根据索引存储对象。

您可以像这样使用 NSMutableDictionary:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

[dict setObject:something forKey:@"Some Key"];

// ... and later ...

id something = [dict objectForKey:@"Some Key"];

其次,valueForKeyPath: returns 不是数组的值和 valueForKey: returns 键的值数组,而且该数组不是可变的。

编辑:

第三,在对 valueForKeyPath:found its use in collection operation and syntax for using is 进行更多研究之后。所以,通过改变

[_arr_property valueForKeyPath:@"property_list.property_type_name"]

[_arr_property valueForKeyPath:@"@property_list.property_type_name"]