2013-07-23 10 views
5

Während Code an Projekt arbeiten, die mir von einem früheren Entwickler verlassen, habe ich festgestellt dasObjective C warum Formatstring als String

konstruieren folgenden
-(NSString *)StringCheckWithString:(NSString *)string{ 

    NSString *string2 = [NSString stringWithFormat:@"%@", string]; 

    if([string2 length] == 0){ 
     return @"none"; 
    } 
    else { 
     return string2; 
    } 
} 

Kann mir jemand erklären, warum Sie dies tun würde, so scheint es deutlich overengineered zu Ich und ich verstehe nicht, warum es so gemacht wurde (zur Verdeutlichung verstehe ich nicht, warum die Zeichenfolge so formatiert ist, verstehe ich die Längenüberprüfung)

+3

Es ist möglich, dass 'string' ein unbekannter Eingang ist. Wenn es Formatzeichen enthält und Sie es roh verwenden, kann es zu BAD THINGS kommen. – thegrinner

+2

@thegrinner sicher in dem Fall, dass 'string' Formatzeichen enthält,' string2' enthält nun auch diese Zeichen? – James

+0

Ich versuche, meinen Kopf um eine Situation zu wickeln, in der ein NSString, der an eine Methode übergeben wird, NICHT wirklich ein NSString ist. Hat jemand ein konkretes Beispiel, wie man diese Situation erreichen kann? – Dan

Antwort

8

Das Argument, das übergeben wird, könnte jeder sein Unterklasse von String, einschließlich NSMutableString. Dieser Code erstellt eine unveränderbare Kopie davon. Dies bedeutet, dass Sie den zurückgegebenen String speichern können, ohne sich darum kümmern zu müssen, dass jemand anders diesen ändert.

wäre ein besserer Weg, dies zu tun:

NSString *string2 = [string copy]; 

Nach den NSCopying Protocol reference:

Die Kopie zurückgegeben wird, ist unveränderlich, wenn die Gegenleistung „unveränderlich gegen wandelbar“ an den Empfang gilt Objekt.

+0

Ich mag diese Antwort.Von der Untersuchung der Verwendung, ich bezweifle, dass es die Absicht war, aber es macht Sinn als ein wünschenswerter Effekt – James

+8

'[String Kopie]' scheint mir klarer zu sein. – jszumski

+0

Ich stimme @jszumski zu - wenn ich etwas zu diesem Zweck schreiben würde, würde ich 'copy' verwenden. – Jasarien