2012-04-11 9 views
3

Ich fange gerade an, IOS Entwicklung zu lernen. Jedes Mal, wenn ich dieses Programm starte, zeigt die Konsole nicht immer meine NSLogs an.Xcode, Warum werden einige NSLog-Einträge in der Konsole weggelassen?

#import <Foundation/Foundation.h> 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     NSMutableArray *items = [[NSMutableArray alloc] init]; 

     [items addObject:@"One"]; 
     [items addObject:@"Two"]; 
     [items addObject:@"Three"]; 

     [items insertObject:@"zero" atIndex:0]; 

     NSLog(@"Object at 0 is %@", [items objectAtIndex:0]); 
     NSLog(@"Object at 1 is %@", [items objectAtIndex:1]); 
     NSLog(@"Object at 2 is %@", [items objectAtIndex:2]); 
     NSLog(@"Object at 3 is %@", [items objectAtIndex:3]); 

     for (int i = 0; i < [items count]; i++) { 
      NSLog(@"%@", [items objectAtIndex:i]); 
     } 
     items = nil;   
    } 
    return 0; 
} 

sollte ich jedes Mal, dies in der Konsole bekommen ich es laufen:

2012-04-11 16:29:10.419 RandomPossessions[701:403] Object at 0 is zero 
2012-04-11 16:29:10.421 RandomPossessions[701:403] Object at 1 is One 
2012-04-11 16:29:10.422 RandomPossessions[701:403] Object at 2 is Two 
2012-04-11 16:29:10.422 RandomPossessions[701:403] Object at 3 is Three 
2012-04-11 16:29:10.423 RandomPossessions[701:403] zero 
2012-04-11 16:29:10.423 RandomPossessions[701:403] One 
2012-04-11 16:29:10.424 RandomPossessions[701:403] Two 
2012-04-11 16:29:10.424 RandomPossessions[701:403] Three 

Aber manchmal ist es nicht alles angezeigt wird. Ein anderes Mal, wenn ich es laufen, und ich konnte nur erhalten:

2012-04-11 16:48:20.626 RandomPossessions[734:403] Object at 0 is zero 
2012-04-11 16:48:20.628 RandomPossessions[734:403] Object at 1 is One 

Ich habe das Programm mehrmals ausführen, um die vollständige Liste der NSLogs zur Ausgabe an die Konsole zu erhalten. Ist das ein Fehler, oder mache ich etwas falsch? Danke

+1

Haben Sie einen Haltepunkt hinzufügen? (blaue Dinge in der linken Seite Ihres Codes) –

+0

Danke. Das hilft definitiv. Ich habe einen Haltepunkt bei der Return-Anweisung gesetzt. Jetzt werden alle meine Protokolle auf der Konsole ausgegeben. Irgendeine Idee, warum es das ohne die Haltepunkte nicht tut? – Waynelee3d

+0

Entschuldigung, ich habe dich beim ersten Mal missverstanden. Ich dachte, du wolltest, dass ich einen Haltepunkt einfüge. Ich hatte zunächst keine Haltepunkte im Programm. Aber als ich eines hinzufügte, wurden alle meine NSLogs ausgegeben. Wenn keine Haltepunkte vorhanden sind, fehlen einige NSLog-Ausgaben. – Waynelee3d

Antwort

5

Faszinierend. Ich habe gerade Ihren Code ausprobiert und das gleiche Ergebnis erzielt. Hier ist meine Hypothese:

ein Haltepunkt an Ihrer Linie:

[items insertObject:@"zero" atIndex:0]; 

Wenn der Debugger dort ankommt, das Debug-Fenster zeigt einen Thread.

Jetzt Schritt vorwärts zu

NSLog(@"Object at 1 is %@", [items objectAtIndex:1]); 

Nun gibt es drei Themen.

Ich wette, dass diese anderen 2 Threads das eigentliche Schreiben in das Protokoll tun. Wenn das Programm beendet wird, bevor diese separaten Threads in das Protokoll geschrieben wurden, werden sie einfach getötet und Ihre Protokolle werden nicht geschrieben.

Ich habe versucht, einen Anruf zu

sleep(0); 

am Ende der Hauptfunktion hinzugefügt, und plötzlich die Protokolle gestartet angemessen erscheinen.

Ich versuchte dann, diese Linie zu entfernen, und die ursprünglichen Symptome verschwanden, und ich kann das Problem, das Sie hatten, nicht mehr neu erstellen.

Fazit: Ich denke, das ist ein Symptom für das Beenden des Programms, bevor die Protokolle geschrieben wurden. Wenn Sie eine iOS-App schreiben, müssen Sie sich um solche Dinge keine Gedanken machen. Es ist nur ein obskures Implementierungsdetail.

Viel Glück zu lernen.

+0

Ich versuchte Schlaf (0); Es hat nichts für mich getan. Aber die Sache mit mehreren Threads, wo das Programm beendet wird, bevor die Logs geschrieben werden, scheint korrekt zu sein. Ich habe einen Haltepunkt kurz vor der Return-Anweisung gesetzt und alle meine Logs erscheinen jedes Mal korrekt. Danke – Waynelee3d

+0

Ich denke Richard J. Ross hat die richtige Strategie mit fflush(). Ich habe seine Antwort aufgewertet, und ich denke, Sie sollten es versuchen. –

+0

Im Put flush (stdout) am Ende vor der Rückkehr Aussage. Meine Protokolle fehlen jedoch noch. Ich weiß nicht, ob ich es richtig mache. – Waynelee3d

3

Verwenden fflush() schreiben die Puffer, bevor Sie die Anwendung beenden:

fflush(stdout); 

Oder verwenden NSFileHandle:

[[NSFileHandle fileHandleWithStandardOutput] synchronizeFile]; 
+0

Ich habe das versucht. Ich kann es scheinbar nicht dazu bringen, etwas zu tun. Meine NSLogs fehlen noch. – Waynelee3d

+1

Vielleicht sollte es fflush (stderr) sein; –