2013-05-14 5 views
1

Мой код выглядит так, иногда приложение падает в последней строке при попытке зарегистрировать ошибку. Что я делаю не так?Правильный способ обращения к NSError

BOOL isDir; 
NSError *error; 
NSString *downloadPath = [[NSString stringWithFormat:@"%@/%@", [download downloadFolder], [download escapedTitle]] stringByExpandingTildeInPath]; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 

if (![fileManager fileExistsAtPath:downloadPath isDirectory:&isDir]) 
{ 
    [fileManager createDirectoryAtPath:downloadPath withIntermediateDirectories:YES attributes:nil error:&error]; 

    if (error) 
     NSLog(@"%@", [error localizedDescription]); 
} 

Я также прикрепил выход из консоли: enter image description here

+1

@Wain Хотя это может работать для большинства практических целей, она не гарантируется, так как указатель может быть изменен на неверное значение во время выполнения метода. Значение 'error' будет действительным только в том случае, если метод возвращает' NO'. – gaige

+0

@gaige Правда, это не должно произойти, но это действительно так. – Wain

+0

@Wain Нет, нет причин для инициализации указателя 'error' на' nil', и никогда не используется для использования 'if (error) ...'. – bbum

ответ

4

В какао, то NSError ** только справедливо, если вызываемый метод возвращает ошибку, которая в данном случае будет, если -createDirectoryAtPath:... возвращает ложь ,

Вместо проверки на if (error) проверьте, чтобы возвращаемое значение метода -createDirectoryAtPath: было ложным, и вам будет хорошо идти.

Например:

if (![fileManager createDirectoryAtPath:downloadPath withIntermediateDirectories:YES attributes:nil error:&error]) { 
    NSLog(@"%@", [error localizedDescription]); 
} 
+0

Итак, это лучший метод? if (! [fileManager createDirectoryAtPath: downloadPath withIntermediateDirectories: YES атрибуты: nil error: & error]) NSLog (@ "% @", [error localizedDescription]); – Thunder

+0

Да, я просто добавлял это к своему ответу ;-) – gaige

+0

В этом случае также проверить, создан ли NSArray? 'NSError * error = nil; NSArray * downloads = [self.managedObjectContext executeFetchRequest: allDownloads error: & error]; ' – Thunder

Смежные вопросы