Zauważyłem pewne dziwne zachowanie z NSBundle podczas korzystania z niego w programie wiersza poleceń . Jeśli w moim programie pobieram istniejący pakiet i robię jego kopię, a następnie spróbuję użyć pathForResource do sprawdzenia, czy coś jest w folderze Zasoby, to jest ono zawsze zwracane, chyba że pakiet znajdował się przed moim uruchomiono program. I stworzył aplikację przykładowy, który replikuje problem i odpowiedni kod jest:NSBundle pathForResource zawodzi w narzędziu powłoki
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];
}
Dla celów tej aplikacji testowej, załóżmy, że TestApp.app już istnieje w tym samym katalogu co mój aplikacji testowej. Jeśli uruchomię to, wywołanie 2-ty NSLog wyświetli: COPY: (null)
Teraz, jeśli mogę wypowiedzieć się na ostateczną rozmowę removeItemAtPath w razie rachunku tak, że kiedy mój program wychodzi TestAppCopy.app nadal istnieje i następnie uruchom ponownie, program będzie działać zgodnie z oczekiwaniami.
Próbowałem tego w normalnej aplikacji kakao i nie mogę odtworzyć tego zachowania w postaci . Dzieje się tak tylko w celu narzędzia powłoki. Czy ktoś może pomyśleć o przyczynie niepowodzenia?
BTW: Próbuję to na 10.6.4 i nie próbowałem na innych wersji Mac OS X.
AKTUALIZACJA: Jeśli przeniesię moje pakiety testowe do innego katalogu niż ten, w którym znajduje się moje narzędzie powłoki, wszystko działa poprawnie. Widzę więc problem tylko wtedy, gdy pakiety znajdują się w tym samym katalogu co moja aplikacja. Mogę pracować z tym wymaganiem, ale dobrze byłoby wiedzieć, dlaczego nie działa tak, jak opisałem pierwotnie. – Dustin
Jak już wspomniano, pracowałem nad tym jak na razie, ale jestem naprawdę zainteresowany zrozumieniem, dlaczego tak się dzieje i co mogę zrobić, aby temu zapobiec. – Dustin