Ошибка NSBundle pathForResource в инструменте оболочки

Я заметил странное поведение с 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.

5
задан Dustin 4 October 2010 в 19:57
поделиться