更新NSMutableArray中的值

时间:2014-10-22 19:25:45

标签: ios objective-c nsmutablearray

我正在尝试更新NSMutableArray中的特定密钥。该阵列名为 ListForTable ,我正在尝试更新密钥 statusReport 。数组中有4个对象。我正在尝试更新第一个。以下是导致错误:

[ListForTable replaceObjectAtIndex:[[ListForTable objectAtIndex:0] objectForKey:@"statusReport"] withObject:@"No edits"];

按以下方式创建数组:

[ListForTable addObject:[NSDictionary dictionaryWithObjectsAndKeys: itemName, @"itemName", @"", @"statusReport", nil]];

任何人都可以解释原因吗?

错误消息是:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM replaceObjectAtIndex:withObject:]: index 1087320 beyond bounds [0 .. 3]'
*** First throw call stack:
(0x2c57df87 0x39f1ac77 0x2c49b331 0xbe9bb 0x2f9fc86d 0x2f9fc5dd 0x300511f7 0x2fcc5b51 0x2fcdd933 0x2fcdf8cb 0x2fadc615 0xab051 0x2fa2d497 0x2fa2d439 0x2fa1804d 0x2fa2ce69 0x2fa2cb43 0x2fa26451 0x2f9fccc5 0x2fc70513 0x2f9fb707 0x2c544807 0x2c543c1b 0x2c542299 0x2c48fdb1 0x2c48fbc3 0x337c4051 0x2fa5ba31 0x604d5 0x3a4b6aaf)
libc++abi.dylib: terminating with uncaught exception of type NSException

3 个答案:

答案 0 :(得分:1)

这是一个错误:

[ListForTable replaceObjectAtIndex:[[ListForTable objectAtIndex:0] objectForKey:@"statusReport"] withObject:@"No edits"];

你的参数混乱了。

[ListForTable replaceObjectAtIndex:...]

应该采用integer

但是

[[ListForTable objectAtIndex:0] objectForKey:@"statusReport"]

可能不是整数。

不是替换它,而是获取指向它的指针:

NSMutableDictionary *entry = [[ListForTable objectAtIndex:0] mutableCopy];

并更新它:

entry[@"statusReport"] = @"No edits";

然后替换:

[ListForTable replaceObjectAtIndex:0 withObject:[entry copy]];

逻辑是:您无法修改NSDictionary(它是 immutable ),因此您需要一个可以更改的可变副本。更改后,您需要更换它。

[entry copy] 

bit使它再次成为一个不可变的字典。

说实话,看起来你不希望这个数组包含不可变对象,但我希望这能解释你的问题

答案 1 :(得分:0)

[ListForTable replaceObjectAtIndex:
 [[ListForTable objectAtIndex:0] objectForKey:@"statusReport"]
 withObject:@"No edits"];

第二行是你的"索引"但它似乎是某种对象。

试图解析你的意图,我想也许你没有尝试过:

ary[0] = "something else";

您正在尝试修改数组中的某些内容吗?

如果是这样,你可能想要做更像这样的事情:

MyCoolObject *o = [ListForTable objectAtIndex: 0];
[o setSomethingOrOther: @"No Edits"];

但是如果你只是想换掉数组中的东西。您需要执行以下操作:

[ListForTable replaceObjectAtIndex: 0 withObject: @"whatever!"];

在遍历数组时不要调用它。也不要以大写字母开头命名变量。

答案 2 :(得分:0)

你想这样做:

[[ListForTable objectAtIndex: 0] setObject:@"no edits" forKey:@"statusReport"];