NSFileManager работает, когда встроен в Xcode как релиз, но не когда запускается как автономное приложение OS X Cocoa - PullRequest
0 голосов
/ 16 июня 2011

У меня есть следующая функция, написанная для случайного выбора файла из каталога. Это работает совершенно нормально, когда я строю проект в XCode для выпуска с приложением, которое автоматически открывается. Однако, если я открою приложение из поиска, нажатие кнопки, которая вызывает эту функцию, приведет к зависанию моей программы и ее аварийному завершению. Единственное, о чем я мог подумать, это изменить аргумент на contentOfDirectoryAtPath: чтобы не было ./, но любая из версий имеет точно такую ​​же проблему.

Взгляд на консоль говорит мне, что моя программа вышла ненормально с исключением с плавающей запятой, но я понятия не имею, что его вызывает. Ребята, вы что-то выскакиваете, чего я не вижу? Я начал изучать / использовать цель-C и какао только неделю назад, так что для меня все это довольно ново.

Спасибо, что взглянули на это ...

- (NSMutableString*)setFilePathRandom{
NSArray* files;
NSFileManager* fileManager;
fileManager = [[NSFileManager alloc] init];
files = [fileManager contentsOfDirectoryAtPath:@"./Random Trippy Pics" error:NULL];
NSString* directoryPath = (NSMutableString*)[fileManager currentDirectoryPath];
NSString* fileName;
do{
    fileName = [files objectAtIndex:(arc4random()%[files count])];
}while([fileName isEqualToString:@".DS_Store"]);
filePath = [NSString stringWithFormat:@"%@/Random Trippy Pics/%@",directoryPath,fileName];
[fileManager release];
return filePath;
}

1 Ответ

0 голосов
/ 16 июня 2011

Когда приложение OS X запускается из XCode, его текущим каталогом является путь к папке сборки. При запуске «нормально» текущим каталогом является /. Таким образом, ваша программа ищет каталог в /Random Trippy Pics, который почти наверняка не существует. Где этот каталог обычно?


Edit:

Вы можете получить каталог, в котором приложение в данный момент хранится, с этим битом кода:

NSString *currentStoragePath = [[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent];

Однако, если приложению требуется каталог Random Trippy Pics, его следует хранить в известном месте, предпочтительно в каталоге Resource приложения. Затем вы можете получить содержимое с помощью:

NSArray *files = [[NSBundle mainBundle] pathsForResourceOfType:nil inDirectory:@"Random Trippy Pics"];
...