Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 从xcode在终端中运行代码时的无限循环_Objective C_Cocoa_Terminal - Fatal编程技术网

Objective c 从xcode在终端中运行代码时的无限循环

Objective c 从xcode在终端中运行代码时的无限循环,objective-c,cocoa,terminal,Objective C,Cocoa,Terminal,我正在写一个小应用程序来跟踪本地的mono站点。我写这篇文章主要是为了我自己使用,也为了玩xcode 要启动服务器,我运行以下代码: [task setLaunchPath: @"/usr/bin/xsp2"]; NSArray *arguments = [NSArray arrayWithObjects: @"--root", [[document selectedSite] valueForKey:@"path"], @"--nonstop" ,nil]; [task setArgument

我正在写一个小应用程序来跟踪本地的mono站点。我写这篇文章主要是为了我自己使用,也为了玩xcode

要启动服务器,我运行以下代码:

[task setLaunchPath: @"/usr/bin/xsp2"];
NSArray *arguments = [NSArray arrayWithObjects: @"--root", [[document selectedSite] valueForKey:@"path"], @"--nonstop" ,nil];
[task setArguments: arguments];
NSLog(@"argument: %@", arguments);

NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];

NSFileHandle *file = [pipe fileHandleForReading];

[task launch];

NSData *inData = nil;   
while ((inData = [file availableData]) && [inData length]) {
    NSLog(@"%@", [[NSString alloc] initWithData:inData encoding:NSUTF8StringEncoding]);
}

[[document selectedSite] setValue:[NSNumber numberWithInt:1] forKey:@"active"];

[task release];
NSLog(@"opened site");
这将导致无限循环,因为终端从未停止写入(我猜是吧?)。所以我的问题是,如何停止循环?如果我不清楚,请评论

当你说“终端永远不会停止写入(我想是吧?”)时,是因为输出一直在终端或控制台中喷出吗?如果您没有获得大量的输出,那么调用
availableData
blocks-consult是可能的。您可以尝试
readdatatoendofile
,看看它是否有帮助-您不应该将其放入循环中,除非它是一个非常大的文件(大于UINT\u MAX字节)


另外,要意识到在循环的每次迭代中(可能)都会泄漏一个NSString。记住在NSLog()调用中自动释放字符串。

是。。在您的情况下,availableData将被阻止,因为没有可用数据,但它尚未遇到文件结尾(如果服务器关闭其管道末端,可能会发生这种情况)


一种解决方案是只监听另一个线程上的输出。您的线程永远不会关闭,但也不会占用CPU。

感谢您花时间留下Quinn答案,并提供泄漏提示:)当我使用readDataToEndOfFile时,我的应用程序也会阻塞(旋转死亡之轮)。当我在终端中运行代码时,它会写入以下文本片段xsp2侦听地址:0.0.0.0根目录:/Users/Mads侦听端口:8080(非安全)点击Return停止服务器。