你的代码:
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 返回的所有值都是不可变的,包括sampleArray
、temp1
和temp2
。(而且,不,它们不能通过简单地更改声明来使其可变。)
所以你有点卡住了。您需要完全重新设计此功能。