-1

我正在将一个数组从一个 ViewController 传递到另一个。[NSUserDefaults standardUserDefaults]我在第二个视图控制器中检索数组,当我尝试更新一个字符串值时,它会抛出一个异常,如下所示

Attempt to mutate immutable object with setString

下面是我的代码。无法跟踪是什么问题。

NSMutableArray *sampleArray = [[NSMutableArray alloc]init];
sampleArray = [[[NSUserDefaults standardUserDefaults]objectForKey:@"commentsArray"] copy];
NSString *commentCount = [NSString stringWithFormat:@"%@",[[sampleArray valueForKey:@"totalComments"]objectAtIndex:Row]];
int cCount = [commentCount intValue];
[[[sampleArray valueForKey:@"totalComments"] objectAtIndex:Row]setString:[NSString stringWithFormat:@"%d",cCount+1]];

提前致谢。

4

4 回答 4

1

你的代码:

    NSMutableArray *sampleArray = [[NSMutableArray alloc]init];
    sampleArray = [[[NSUserDefaults standardUserDefaults]objectForKey:@"commentsArray"] copy];
    NSString *commentCount = [NSString stringWithFormat:@"%@",[[sampleArray valueForKey:@"totalComments"]objectAtIndex:Row]];
    int cCount = [commentCount intValue];
    [[[sampleArray valueForKey:@"totalComments"] objectAtIndex:Row]setString:[NSString stringWithFormat:@"%d",cCount+1]];

1)你做

NSMutableArray *sampleArray = [[NSMutableArray alloc]init];
sampleArray = [[[NSUserDefaults standardUserDefaults]objectForKey:@"commentsArray"] copy];

构造[[NSMutableArray alloc]init]一个空的可变数组。随后用指向不同数组的指针sampleArray = [[[NSUserDefaults ... 覆盖在前一行中设置的指针。这是浪费的运动(并且创建对象很昂贵)。谢天谢地,有 ARC,否则它也代表泄漏的对象。应该很简单

 NSArray *sampleArray = [[NSUserDefaults ...

(注意它不是NSMutableArray——见下文。)

2)你做

sampleArray = [[[NSUserDefaults standardUserDefaults]objectForKey:@"commentsArray"] copy];

最后copy不必要地获取objectForKey并复制它返回的对象。除非这里有可能对原始数组进行不必要的并发修改(在这种情况下这是不可能的),否则此copy操作是完全没有必要的,并且又是一项昂贵的操作。

3)你做

NSString *commentCount = [NSString stringWithFormat:@"%@",[[sampleArray valueForKey:@"totalComments"]objectAtIndex:Row]];

简单[NSString stringWithFormat:@"%@",someValue](且昂贵)创建someValue. 同样,这完全没有必要——它只会让你的陈述变得更长、更混乱。

4)你做

[[[sampleArray valueForKey:@"totalComments"] objectAtIndex:Row]setString:[NSString stringWithFormat:@"%d",cCount+1]];

让我们把这个(不必要的)长声明分开:

NSArray* temp1 = [sampleArray valueForKey:@"totalComments"];

这是使用“键值”编码,将检查数组中的每个 NSDictionary 并要求它提供任何“totalComments”元素。

NSString* temp2 = [temp1 objectAtIndex:Row];

这会从元素中获取结果valueForKey并仅检查Row元素。尽管在不知道“commentsArray”是如何构造的情况下很难确定,但很可能它可以同样有效地(并且更清楚地)访问 的Row元素,sampleArray然后totalCommnts从生成的 NSDictionary 请求值。这会更快更清晰。

您现在在 temp2 中拥有的是一个 NSString。您现在有效地执行

[temp2 setString:[NSString stringWithFormat:@"%d",cCount+1]];

当然,您的问题是现在 NSString 是不可变的,因此会发生异常。如果你想改变它,你必须有一个 NSMutableString。但是你不能简单地在temp1数组中“安装”其中一个,因为NSUserDefaults 返回的所有值都是不可变的,包括sampleArraytemp1temp2。(而且,不,它们不能通过简单地更改声明来使其可变。)

所以你有点卡住了。您需要完全重新设计此功能。

于 2014-07-11T02:14:35.503 回答
0

你的代码行有问题

sampleArray = [[[NSUserDefaults standardUserDefaults]objectForKey:@"commentsArray"] copy];

因为复制返回非可变数组所以你必须这样做

sampleArray = [NSMutableArray arrayWithArray:[[[NSUserDefaults standardUserDefaults]objectForKey:@"commentsArray"];
于 2014-07-10T11:52:33.340 回答
-1

问题是您将可变数组值传递给不可变字符串。尝试将 NSString 更改为 NSMutableString。希望这会有所帮助

于 2014-07-10T12:29:30.643 回答
-1
NSMutableArray *sampleArray = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults]objectForKey:@"commentsArray"]];
NSString *commentCount = [NSString stringWithFormat:@"%@",[[sampleArray valueForKey:@"totalComments"]objectAtIndex:Row]];
int cCount = [commentCount intValue];
NSMutableString *myMutableString = [NSMutableString stringWithString:[[sampleArray valueForKey:@"totalComments"] objectAtIndex:Row]];
[myMutableString setString:[NSString stringWithFormat:@"%d",cCount+1]];
于 2014-07-10T11:51:55.943 回答