为啥我的程序可以在 Xcode 中运行,但不能作为单独的应用程序运行?

Posted

技术标签:

【中文标题】为啥我的程序可以在 Xcode 中运行,但不能作为单独的应用程序运行?【英文标题】:Why my program can run in Xcode, but cannot running as a separate app?为什么我的程序可以在 Xcode 中运行,但不能作为单独的应用程序运行? 【发布时间】:2013-04-02 15:06:56 【问题描述】:

我的程序从文件中加载一些数据,然后绘制它们。

文件读取部分是这样的:

- (void)load_file

    NSFileHandle *inFile = [NSFileHandle fileHandleForReadingAtPath:@"map_data"];
    NSData  *myData=[inFile readDataToEndOfFile];
    NSString *myText=[[NSString alloc]initWithData:myData encoding:NSASCIIStringEncoding];
    NSArray *values = [myText componentsSeparatedByString:@"\n"];
    for (NSString *string in values) 
        NSArray *lines=[string componentsSeparatedByString:@" "];
        if ([lines count] != 2) break;
        NSPoint point= NSMakePoint([lines[0] floatValue], [lines[1] floatValue]);
        [points addObject:[NSValue valueWithPoint:point]];
    
    [self setNeedsDisplay:YES];

调试的时候,我把数据文件放到[NSBundle mainBundle]目录下,程序运行正常。

但是,当我使用实现来取出应用程序时,它永远不会运行。我把数据文件和app放在同一个路径,但是好像加载不出来。


更新

我尝试使用 c++,但仍然失败。

- (void)load_file

    ifstream inf("map_data");
    double x, y;
    while (inf >> x >> y) [points addObject:[NSValue valueWithPoint:NSMakePoint(x, y)]];
    inf.close();

我尝试将构建方案更改为发布并运行,这很好。但是每当我直接进入应用程序的查找器并双击它时,它就不起作用,并且似乎没有加载任何内容。

【问题讨论】:

您必须进行归档构建并将其共享给 Finder。您不能直接从 Finder 运行调试版本。 @matt,我知道而且我这样做了。 【参考方案1】:

将文件作为资源添加到项目中(这将导致它被复制到正确位置的应用包装器中)

使用`[[NSBundle mainBundle] pathForResource:@"map_data" ofType:nil];

这应该会给你文件的路径。该文件不应该被手动复制,它不应该在应用包装器旁边,你也不应该[猜想]一旦它在你的应用包装器中就应该尝试更改或替换文件。

它有时似乎起作用的原因仅仅是巧合。您正在将部分路径传递给NSFileHandle,并且您的应用程序的当前工作目录有时会指向正确的位置,以便数据文件可用。

【讨论】:

【参考方案2】:

我不确定NSFileHandle 是如何处理相对路径的,但通常你使用NSBundle 类来设置路径。

NSString *path = [[NSBundle mainBundle] pathForResource:@"myfile" ofType:@"ext"];

您也可以简单地从文件的内容中初始化一个 NSString,您无需先使用NSFileHandle 将其读入NSData

NSString *text = [[NSString alloc] initWithContentsOfFile:path 
                                   encoding:NSASCIIStringEncoding error:nil];

(如果您想要正确的错误处理,请使用错误参数)

【讨论】:

不行,我认为路径不正确。因为在您的代码中,路径是“~/Library/Developer/Xcode/DerivedData/graph_drawer-dnqhjikipiupyeecmplqquxxkvsp/Build/Products/Debug/graph_drawer.app/Contents/Resources/map_data”,但我的map_data文件与app,即“~/Library/Developer/Xcode/DerivedData/graph_drawer-dnqhjikipiupyeecmplqquxxkvsp/Build/Products/Debug/map_data” 为什么要在应用旁边放一个文件?这不是你通常的做法。您可以将文件放入您发布的第一个路径指定的应用程序包中(在应用程序包中),或者将其放入 ~/Library/Application Support/YourApp

以上是关于为啥我的程序可以在 Xcode 中运行,但不能作为单独的应用程序运行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Xcode 4.1 说我的 iPad 专用应用程序可以在 iPhone 模拟器中运行?

为啥我的 Django 应用程序可以在本地运行,但不能在 Heroku 上运行?

为啥 XCode 说我的 iPhone 应用程序只能在 iPad 上运行?

为啥 Xcode 不能附加到某些程序?

Xcode 我的应用程序无法在 iPad 模拟器中运行,但可以在 iPhone 模拟器中运行

为啥 Web Serial API 应用程序可以在 Windows 和 Linux 中运行,但不能在 macOS 中运行?