/ / Dlaczego mój program może działać w Xcode, ale nie może działać jako osobna aplikacja? - cel-c, xkod

Dlaczego mój program może działać w Xcode, ale nie może działać jako osobna aplikacja? - cel-c, kod xcode

Mój program ładuje niektóre dane z pliku, a następnie je rysuje.

Część do odczytu plików wygląda następująco:

- (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];
}

Podczas debugowania umieszczam plik danych w katalogu [NSBundle mainBundle], a program działa dobrze.

Jednak gdy używam polecenia osiągnij, aby wyjąć aplikację, nigdy się nie uruchamia. Umieszczam plik danych w tej samej ścieżce co aplikacja, ale wydaje się, że nie można go załadować.


Aktualizacja

Próbowałem użyć c ++, ale nadal nie działa.

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

Próbowałem zmienić schemat kompilacji w celu wydania i uruchomienia, co jest w porządku. Ale ilekroć wchodzę bezpośrednio do wyszukiwarki aplikacji i klikam ją dwukrotnie, nie działa i wydaje się, że nic nie jest ładowane.

Odpowiedzi:

1 dla odpowiedzi № 1

Nie jestem pewien, jak obsługiwane są ścieżki względne NSFileHandle, ale zwykle konfigurujesz ścieżki za pomocą NSBundle klasa.

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

Możesz także po prostu zainicjować NSString z zawartości pliku, nie musisz najpierw czytać go w pliku NSData za pomocą NSFileHandle.

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

(Użyj parametru błędu, jeśli chcesz poprawnie obsługiwać błąd)


2 dla odpowiedzi nr 2
  • dodaj plik do projektu jako zasób (spowoduje to skopiowanie go do opakowania aplikacji w odpowiednim miejscu)

  • użyj `[[NSBundle mainBundle] pathForResource: @" data_data "ofType: nil];

To powinno dać ci ścieżkę do pliku. Plik nie powinien być kopiowany ręcznie, nie powinien znajdować się obok opakowania aplikacji, ani nie należy [przypuszczać], że kiedykolwiek spróbujesz zmienić lub zastąpić plik, gdy znajdzie się on w opakowaniu aplikacji.

Powodem, dla którego wydaje się czasem działać, jest zwykły zbieg okoliczności. Przechodzisz częściową ścieżkę do NSFileHandle i zdarza się, że bieżący katalog roboczy Twojej aplikacji czasami wskazuje właściwe miejsce, tak aby plik danych był dostępny.