2012-04-14 8 views
1

Einfach gesagt, der folgende Code hat mich verblüfft, warum es fehlschlagen sollte.NSStringWithFormat Crash

// This line works 
NSString * string = [NSString stringWithFormat:@"%lu",[[NSDate date] timeIntervalSince1970]]; 

// This line works 
string = [NSString stringWithFormat:@"%@",@"somestring"]; 

// This line generates and EXEC_BAD_ACCESS error 
string = [NSString stringWithFormat:@"%lu%@",[[NSDate date] timeIntervalSince1970],@"somestring"]; 

Warum?

Antwort

2

Wert von [[NSDate date] timeIntervalSince1970] zurückgekehrt ist vom Typ NSTimeInterval die vom Typ ist typedef double NSTimeInterval; Sie unsigned int drucken. Ersetzen Sie @"%lu%@" durch @"%f%@" und wird in Ordnung sein.

+0

Oder Sie könnten es zu einem int, d. H. "@"% Lu% @ ", (unsigned int) NSDate.date.timeIntervalSince1970" - obwohl dieser Kommentar nur der Vollständigkeit halber ist; Ich würde tun, was die Antwort sagt :) – deanWombourne

+0

Das wird zwar keinen Absturz verursachen, nur eine unsignierte Version des Rückgabedatums generieren, was die Absicht für meine Zwecke ist. – YuzaKen

+0

@sch - Sie wissen nicht, was passiert mit dem Stapel als Nebeneffekt der Weitergabe im falschen Format Specifier :) Ich vermute, es funktioniert nicht in beiden Fällen, aber der Schaden wird in einem sicheren Abschnitt des Speichers in Fall getan (1), aber im Speicher versuchen Sie dann, im Fall (2) zu verwenden. – deanWombourne