Я заметил странное поведение с NSBundle при его использовании в программа командной строки. Если в своей программе я возьму существующий пакет и сделайте копию, а затем попробуйте использовать pathForResource для поиска что-то в папке Resources, nil всегда возвращается, если только Пакет, который я ищу, существовал до запуска моей программы. Я создал пример приложения, в котором воспроизводится проблема, и соответствующий код:
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];
}
Для целей этого тестового приложения предположим, что TestApp.app уже существует в том же каталоге, что и мое тестовое приложение. Если я запустил это, второй вызов NSLog выведет: COPY: (null)
Теперь, если я закомментирую последний вызов removeItemAtPath в if утверждение, чтобы при выходе из моей программы TestAppCopy.app все еще существовал а затем перезапустите, программа будет работать должным образом.
Я пробовал это в обычном приложении Какао, но не могу воспроизвести поведение. Это происходит только в цели инструмента оболочки. Может ли кто-нибудь придумать причину, по которой это не удается?
Кстати: я пробую это на 10.6.4 и не пробовал на других версии Mac OS X.