为啥我的程序可以在 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 中运行,但不能作为单独的应用程序运行?的主要内容,如果未能解决你的问题,请参考以下文章