2010-01-19 6 views
5

Dies funktioniert:Kakao: NSMutableString gibt, mit String Warnung

NSString *myVar = @"whatever"; 

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

myVar = [myNum stringValue]; 

Diese Version mit wandelbaren String produziert "Zuordnung aus verschiedenem Objective-C-Typ" Warnung:

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

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

myVar = [myNum stringValue]; 

In beiden Fälle Zu ein NSCFString. Die unveränderliche NSString-Variable ist nicht wichtig, beschwert sich der veränderbare NSMutableString.

P.S. jemand bitte fügen Sie Tags für NSMutableString und StringValue hinzu.

+0

Können Sie die gegebene Warnung posten? –

+0

(Ah ich kann Kommentare posten, wie ich immer noch kochte ...). Laurent, es ist nur eine gelbe Xcode-Warnung: "Warnung: Zuweisung von verschiedenen Objective-C-Typ". – StringSection

+0

Die Antworten von Phillipe und Vladimir haben die Situation erklärt. Das Problem besteht darin, dass das stringValue-Objekt unveränderlich ist und daher keiner veränderbaren Zeichenfolgenvariablen zugewiesen werden kann. (Vladimir weist auch darauf hin, dass mein NSMutableString * myVar = @ "was auch immer"; Code ist grundsätzlich illegal, obwohl er die betreffende Warnung nicht erzeugt.) Danke! – StringSection

Antwort

6

-stringValue gibt automatisch freigegebene Instanz von NSString zurück, das ist unveränderliches Objekt. Auch wenn Sie es an die veränderbare Zeichenfolge zuweisen Zeiger wird es nicht die Zeichenfolge wandelbar machen und Sie werden nicht wandelbar String-Methoden auf, zu nennen es fähig sein (btw, gleich bleibt wahr für Ihren ersten Code):

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

der richtige Weg, es zu handhaben ist wandelbar String mit convinience Methode zu erstellen:

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

Oder Sie können '[aString mutableCopy]' verwenden. –

+0

Beachten Sie, dass ich nach Wladimirs Kommentar den Code im ursprünglichen Post korrigiert habe, um zu zeigen, dass ursprünglich ein richtiger NSMutableString erstellt wurde. – StringSection

+0

, wenn Sie eine Zeichenfolge wie folgt zuweisen: myVar = [myNum stringValue]; Sie verwirft alle vorherigen Zuordnungen - es spielt keine Rolle, wie Sie zuvor Ihre Zeichenfolge erstellt haben, jetzt enthält myVar das Ergebnis von -stringValue und der vorherige Wert ist verloren. – Vladimir

4

[myNum String] gibt eine NSString, nicht NSMutableString, so wird dies die Warnung erzeugen.

Wenn Sie später versuchen würden, die Instanz von myVar zu manipulieren (vorausgesetzt, es handelt sich um eine veränderbare Zeichenfolge), erhalten Sie eine Ausnahme, da das Objekt überhaupt keine veränderbare Zeichenfolge ist.

0

Sie können eine unveränderliche Zeichenfolge nicht in eine veränderbare Zeichenfolge ändern, indem Sie sie einfach einer Variablen vom Typ NSMutableString * zuweisen. Was Sie tun, ist im Wesentlichen:

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

Beide Variablen in diesem Fall zeigen Sie auf genau die gleiche konstante String-Objekt (die Zeiger vergleicht gleich). Sie erhalten außerdem eine Warnung, weil Sie versuchen, eine Variable vom Typ NSMutableString * mit einem inkompatiblen Wert vom Typ NSString * zu setzen. Es ist inkompatibel, da NSMutableString * Methoden und Verhalten bietet, die NSString * nicht, also wenn Sie versuchen, NSMutableString 's Verhalten zu verwenden, erhalten Sie Laufzeitfehler, da das tatsächliche Objekt, auf das die Variable zeigt, kein NSMutableString ist.