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' が原因でアプリを終了しています。
私の質問は、不変オブジェクトを変更しようとしている場所はどこですか? 第二に、これが Xcode 4.1 でうまく実行されたのはなぜですか? 確かに、すべてのプレイヤーは Xcode 4.1 に対して変更可能に見えました。Xcode 4.2 の違いは何ですか? ここで微妙なものが欠けています。