3

我刚开始学习IOS开发。每次我运行这个程序时,控制台并不总是显示我的 NSLogs。

#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

我必须多次运行该程序才能将完整的 NSLog 列表输出到控制台。这是一个错误,还是我做错了什么?谢谢

4

2 回答 2

5

迷人。我刚刚尝试了您的代码并得到了相同的结果。这是我的假设:

在您的行设置断点:

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

当调试器到达那里时,调试面板显示一个线程。

现在向前迈进

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

现在有3个线程。

我敢打赌,其他 2 个线程正在对日志进行实际写入。如果程序在这些单独的线程写入日志之前完成,那么它们就会被杀死,并且您的日志不会被写入。

我尝试添加一个呼叫

sleep(0);

在 main 函数结束时,突然日志开始适当地出现。

然后我尝试删除该行,原始症状消失了,我无法再重现您遇到的问题。

底线:我认为这是程序在写入日志之前退出的症状。如果您正在编写 iOS 应用程序,则不必担心这种事情。这只是一个模糊的实现细节。

祝学习顺利。

于 2012-04-11T17:43:25.957 回答
3

用于fflush()在退出应用程序之前写出缓冲区:

fflush(stdout);

或使用NSFileHandle

[[NSFileHandle fileHandleWithStandardOutput] synchronizeFile];
于 2012-04-11T17:54:40.370 回答