2012-04-11 1 views
3

Я только начинаю изучать развитие IOS. Каждый раз, когда я запускаю эту программу, консоль не всегда отображает мои NSLogs.Xcode, почему некоторые записи NSLog опущены с консоли?

#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; 
} 

я должен получать это в консоли каждый раз, когда я запустить его:

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 

Но иногда это не все отображается. В другой раз я бегу, и я мог бы просто получить:

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 

Я должен запустить программу несколько раз, чтобы получить полный список NSLogs для вывода на консоль. Это ошибка, или я делаю что-то неправильно? Thanks

+1

Вы добавить точку останова? (синие вещи слева от вашего кода) –

+0

Спасибо. Это определенно помогает. Я поставил точку останова в операторе return. Теперь все мои журналы выводятся на консоль. Любая идея, почему это не делает это без контрольных точек? – Waynelee3d

+0

Извините, я вас неправильно понял в первый раз. Я думал, вы хотели, чтобы я поставил точку останова. Сначала у меня не было точек останова в программе. Но когда я добавил один, все мои NSLogs получили выход. Если нет точек останова, некоторые выходы NSLog отсутствуют. – Waynelee3d

ответ

5

Увлекательный. Я просто попробовал свой код и получил тот же результат. Вот моя гипотеза:

установить контрольную точку на вашей линии:

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

Когда отладчик получает там, панель отладки показывает одну нить.

Теперь шаг вперед к

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

В настоящее время существует 3 темы.

Я уверен, что те другие 2 потока выполняют фактическое письмо в журнал. Если программа заканчивается до того, как эти отдельные потоки записаны в журнал, тогда их просто убивают, а ваши журналы не записываются.

Я попытался добавить вызов

sleep(0); 

в конце основной функции, и вдруг журналы стали появляться надлежащим образом.

Я попытался удалить эту строку, и исходные симптомы исчезли, и я больше не могу воссоздать проблему, с которой вы столкнулись.

Итог: Я думаю, что это симптом программы, выходящей перед записью журналов. Если вы пишете приложение iOS, вам не придется беспокоиться об этом. Это просто неясная деталь реализации.

Удачи учебы.

+0

Я пробовал спать (0); Это ничего не делало для меня. Но проблема с несколькими потоками, когда программа завершает работу перед записью журналов, кажется правильной. Я поставил точку останова непосредственно перед оператором return, и все мои журналы отображаются правильно каждый раз. Спасибо – Waynelee3d

+0

Я думаю, что Ричард Дж. Росс имеет правильную стратегию с fflush(). Я поддержал его ответ, и я думаю, вы должны попробовать. –

+0

Im put flush (stdout) в конце перед оператором return. Однако мои журналы все еще отсутствуют. Я не знаю, правильно ли я это делаю. – Waynelee3d

3

Использования fflush() писать буфер перед выходом из приложения:

fflush(stdout); 

Или используйте NSFileHandle:

[[NSFileHandle fileHandleWithStandardOutput] synchronizeFile]; 
+0

Я пробовал это. Кажется, я ничего не могу сделать. Мои NSLogs все еще отсутствуют. – Waynelee3d

+1

Возможно, это должно быть fflush (stderr); –

Смежные вопросы