Ho notato alcuni comportamenti strani con NSBundle quando lo si utilizza in un programma di riga comandi . Se, nel mio programma, prendo un pacchetto esistente e ne faccio una copia e poi provo a usare pathForResource per cercare qualcosa nella cartella Risorse, nil è sempre restituito a meno che il pacchetto che sto cercando esistesse prima del mio programma avviato. Ho creato un'applicazione campione che replica il problema e il codice di riferimento è:NSBundle pathForResource non riuscito nello strumento shell
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *exePath = [NSString stringWithCString:argv[0]
encoding:NSASCIIStringEncoding];
NSString *path = [exePath stringByDeletingLastPathComponent];
NSString *templatePath = [path stringByAppendingPathComponent:@"TestApp.app"];
// This call works because TestApp.app exists before this program is run
NSString *resourcePath = [NSBundle pathForResource:@"InfoPlist"
ofType:@"strings"
inDirectory:templatePath];
NSLog(@"NOCOPY: %@", resourcePath);
NSString *copyPath = [path stringByAppendingPathComponent:@"TestAppCopy.app"];
[[NSFileManager defaultManager] removeItemAtPath:copyPath
error:nil];
if ([[NSFileManager defaultManager] copyItemAtPath:templatePath
toPath:copyPath
error:nil])
{
// This call will fail if TestAppCopy.app does not exist before
// this program is run
NSString *resourcePath2 = [NSBundle pathForResource:@"InfoPlist"
ofType:@"strings"
inDirectory:copyPath];
NSLog(@"COPY: %@", resourcePath2);
[[NSFileManager defaultManager] removeItemAtPath:copyPath
error:nil];
}
[pool release];
}
Ai fini di questa applicazione di test, supponiamo che TestApp.app esiste già nella stessa directory come la mia applicazione di test. Se ho eseguito questo, la chiamata 2 ° NSLog sarà in uscita: COPY: (null)
Ora, se io commento la chiamata removeItemAtPath finale nel caso dichiarazione in modo che quando il mio programma esce TestAppCopy.app esiste ancora e quindi rieseguire, il programma funzionerà come previsto.
Ho provato questo in una normale applicazione Cocoa e non riesco a riprodurre il comportamento . Succede solo in un obiettivo dello strumento shell. Qualcuno può pensare a un motivo per cui questo sta fallendo?
BTW: sto cercando questo su 10.6.4 e non ho provato su altri versioni di Mac OS X.
AGGIORNAMENTO: Se trasferisco i miei gruppi di test in un'altra directory oltre a quella in cui si trova il mio strumento shell, tutto funziona correttamente. Quindi, vedo il problema solo se i bundle si trovano nella stessa directory della mia app. Posso lavorare con questo requisito, ma sarebbe bello sapere perché non funziona come ho descritto in origine. – Dustin
Come già detto, per il momento ho lavorato a questo problema, ma sono davvero interessato a capire perché questo sta accadendo e cosa posso fare per evitarlo. – Dustin