/ / Perché il mio programma può essere eseguito in Xcode, ma non può essere eseguito come app separata? - goal-c, xcode

Perché il mio programma può essere eseguito in Xcode, ma non può essere eseguito come app separata? - obiettivo-c, xcode

Il mio programma carica alcuni dati da un file e li disegna.

La parte di lettura dei file è così:

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

Durante il debug, inserisco il file di dati nella directory di [NSBundle mainBundle] e il programma funziona correttamente.

Tuttavia, quando uso raggiungere per estrarre l'app, non funziona mai. Ho inserito il file di dati nello stesso percorso con l'app, ma sembra non riuscire a caricarlo.


Aggiornare

Ho provato a usare c ++, ma ancora fallisce.

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

Ho provato a cambiare lo schema di build per rilasciarlo ed eseguirlo, il che va bene. Ma ogni volta che vado direttamente nel finder dell'app e faccio doppio clic su di esso, non funziona e sembra che non sia caricato nulla.

risposte:

1 per risposta № 1

Non sono sicuro di come vengano gestiti i percorsi relativi NSFileHandle, ma di solito imposti i percorsi usando il NSBundle classe.

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

Puoi anche semplicemente inizializzare un NSString dal contenuto di un file, non è necessario prima leggerlo in un NSData utilizzando NSFileHandle.

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

(Utilizzare il parametro error, se si desidera una corretta gestione degli errori)


2 per risposta № 2
  • aggiungere il file al progetto come risorsa (ciò provocherà la sua copia nel wrapper dell'app nel punto giusto)

  • usa `[[NSBundle mainBundle] pathForResource: @" map_data "ofType: nil];

Questo dovrebbe darti il ​​percorso del file. Il file non deve essere copiato manualmente, non dovrebbe essere vicino al wrapper dell'app, né si dovrebbe mai [congetture] provare a cambiare o sostituire il file una volta che si trova nel wrapper dell'app.

Il motivo per cui sembra funzionare a volte è una semplice coincidenza. Stai passando un percorso parziale a NSFileHandle e succede che l'attuale directory di lavoro della tua app a volte punta nel punto giusto in modo che il file di dati sia disponibile.