2010-01-19 52 views
5

此警告作品:可可:的NSMutableString給出了stringValue的

NSString *myVar = @"whatever"; 

NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"]; 

myVar = [myNum stringValue]; 

這個版本與可變的字符串產生警告 「從不同的Objective-C型分配」:

NSMutableString *myVar = [NSMutableString stringWithString:@"whatever"]; //UPDATE: CORRECTED CODE 

NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"]; 

myVar = [myNum stringValue]; 

在這兩種情況下stringValue的正在恢復一個NSCFString。不可變的NSString變量不關心,可變的NSMutableString抱怨。

P.S.有人請爲NSMutableString和stringValue添加標籤。

+0

你能發佈給定的警告嗎? –

+0

(我可以發表評論,因爲我還在煮...)。 Laurent,它只是一個黃色的Xcode警告:「警告:來自不同的Objective-C類型的賦值」。 – StringSection

+0

菲利普和弗拉基米爾的答案已經解釋了這種情況。問題是stringValue對象是不可變的,所以不能被分配給一個可變字符串變量。 (弗拉基米爾還指出,我的NSMutableString * myVar = @「whatever」;代碼本質上是非法的,雖然沒有創建有關的警告。)謝謝! – StringSection

回答

6

-stringValue返回NSString的自動釋放實例,即不可變對象。即使你把它分配給可變的字符串指針時,它不會使串可變的,你就不能調用它的可變的字符串的方法(順便說一句,同樣保持爲真爲你的第一個代碼):

NSMutableString* tStr = @"lala"; 
[tStr appendString:@"lalala"]; // CRASH! Attempting to mutate immutable object 

來處理它,正確的方法是創建可變的字符串與舒適的方法:

NSMutableString* tStr = [NSMutableString stringWithString:@"lala"]; 
[tStr appendString:@"lalala"]; // OK 
+2

或者你可以使用'[aString mutableCopy]'。 –

+0

請注意,根據Vladimir的評論,我已更正原始帖子中的代碼,以顯示最初創建的正確的NSMutableString。 – StringSection

+0

當你分配一個字符串如:myVar = [myNum stringValue];你放棄了以前的所有分配 - 不管你以前如何創建你的字符串,現在myVar包含-stringValue的結果,並且以前的值會丟失。 – Vladimir

4

[myNum的stringValue的]返回的NSString,不是的NSMutableString,因此這將產生警告。

如果稍後嘗試操作myVar的實例(假設它是一個可變字符串),則會得到一個異常,因爲該對象根本不是可變字符串。

0

只需將其分配給類型爲NSMutableString *的變量,便無法將不可變字符串變爲可變字符串。你在做什麼本質上是:

NSString *immutableStr = @"Mayonnaise"; 
NSMutableString *mutableStr = immutableStr; 

在這種情況下,點完全相同的常量字符串對象兩個變量(指針會比較相等)。您還將收到警告,因爲您正試圖設置類型爲NSString *的不兼容值NSMutableString *的變量。它是不兼容的,因爲NSMutableString *提供了NSString *沒有的方法和行爲,所以當您嘗試使用NSMutableString的行爲時,您將收到運行時錯誤,因爲變量指向的實際對象不是NSMutableString

相關問題