非常简单的代码,我可以说它在 Xcode 4.1 中按预期工作,但在 Xcode 4.2 中中断。这是有问题的代码:
-(void)mergeDevData2Email:(NSMutableString *)target codeArray:(NSArray *)array1 valueArray:(NSArray *)array2 {
NSUInteger n = 0;
for (NSMutableString *aCode in array1) {
if ([array2 count] > n) {
NSMutableString *arg = [array2 objectAtIndex:(NSUInteger)n];
NSLog(@"Target isKindOf NSMutableString: %@", ([target isKindOfClass:[NSMutableString class]]) ? @"YES" :@"NO");
NSLog(@"aCode isKindOf NSMutableString: %@", ([aCode isKindOfClass:[NSMutableString class]]) ? @"YES" :@"NO");
NSLog(@"arg isKindOf NSMutableString: %@", ([arg isKindOfClass:[NSMutableString class]]) ? @"YES" :@"NO");
[target replaceOccurrencesOfString:aCode withString:arg options:NSLiteralSearch range:NSMakeRange(0, [target length])];
n++;
}
else {
break;
}
}
}
这是 NSLogs 显示的内容:
2011-11-03 15:42:59.967 TestProg[30413:c503] 目标 isKindOf NSMutableString: 是
2011-11-03 15:42:59.968 TestProg[30413:c503] aCode isKindOf NSMutableString: 是
2011-11-03 15:42:59.969 TestProg[30413:c503] arg isKindOf NSMutableString: 是
当我执行 [target replaceOcurances... 代码行时,我崩溃了-
节目接收信号:“SIGABRT”。
在控制台日志中使用以下内容 -
2011-11-03 15:43:26.828 TestProg[30413:c503] *由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试使用 replaceOccurrencesOfString:withString:options:range: 来改变不可变对象”
我的问题是,我在哪里尝试改变不可变对象?其次,为什么这在 Xcode 4.1 中执行得很好?当然,所有玩家在 Xcode 4.1 中看起来都是可变的。Xcode 4.2 有什么区别?我在这里遗漏了一些微妙的东西。