非常簡單的代碼,我可以說它在Xcode 4.1中按照預期工作,但在Xcode 4.2中中斷。下面是有問題的代碼:爲什麼當所有變量都可變時嘗試使用replaceOccurrencesOfString嘗試變更不可變對象:
-(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:YES
2011 -11-03 15:42:59.968 TestProg [30413:C503] ACODE isKindOf的NSMutableString:YES
2011-11-03 15:42:59.969 TestProg [30413:C503] ARG isKindOf的NSMutableString:YES
當我執行[target replaceOcurances ...行代碼我碰撞-
編程接收信號:「SIGABRT」。
隨着在控制檯日誌以下 -
2011-11-03 15:43:26.828 TestProg [30413:C503] *終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因:「嘗試mutate與replaceOccurrencesOfString不可變的對象:withString:options:range:'
我的問題是,我在哪裏試圖改變一個不可變的對象?其次,爲什麼在Xcode 4.1中執行得很好?當然,所有玩家都看到了Xcode 4.1的可變性。 Xcode 4.2 有什麼區別?我在這裏錯過了一些微妙的東西。
'isKindOfClass'將返回'YES',如果接收者是給定類或其任何類的實例,所以'[@「這是不可變的'isKindOfClass:[NSMutableString class]]'將返回'YES' 。 – wulong