NSError - это ноль после выхода из области видимости
В моем классе есть участник __strong NSError *authError;
Я хотел бы поймать и создать его в одном методе и проверить в другом. Итак, если ошибка возникает в методе 1:
if([returnString rangeOfString:@"dd"].location != NSNotFound) {
NSMutableDictionary *errorDetail = [NSMutableDictionary dictionary];
[errorDetail setValue:@"Wrong user crediantials" forKey:NSLocalizedDescriptionKey];
authError = [NSError errorWithDomain:@"mydomain" code:101 userInfo:errorDetail];
return nil;
}
Я назначил это непосредственно члену класса authError. Но после перехода на последний брекет authError становится равным нулю. И в методе 2:
if(authError != nil){
return NO;
}
условие возвращает ДА
Некоторая дополнительная информация: метод 2 shouldPerformSegueWithIdentifier
Может ли кто-нибудь дать мне подсказку?
1 ответ
Проблема здесь связана с определением слова "после". Вы устанавливаете переменную экземпляра в методе 1 и извлекаете ее в методе 2. Но это ничего не говорит об истинном порядке операций. Если случится так, что метод 2 будет вызван до того, как метод 1 сможет его запустить, тогда метод 2 обнаружит, что ваша переменная экземпляра равна nil (потому что это ее самоинициализированное значение).
В моей книге есть рифф на эту тему (под "точкой входа" я подразумеваю метод, который вызывается средой выполнения):
В добавление к вашим проблемам является тот факт, что вы не можете точно знать, когда будет вызываться точка входа. Документация может дать вам общий смысл, но в большинстве случаев она ничего не гарантирует о том, когда именно наступят события и в каком порядке. То, что, по вашему мнению, произойдет, и даже то, что документация заставляет вас поверить, может произойти, может быть не совсем тем, что действительно происходит. Ваш собственный код может вызвать непредвиденные события. Документация может не указывать, когда именно будет отправлено уведомление. Может быть даже ошибка в Какао, из-за которой события вызываются так, как будто они противоречат документации. И у вас нет доступа к исходному коду Какао, поэтому вы не можете понять основные детали. Поэтому я также рекомендую, чтобы при разработке вашего приложения вы интенсивно обрабатывали код с помощью отладки caveman (NSLog; см. Главу 9). При тестировании кода следите за выходом консоли и проверяйте, имеют ли сообщения смысл. Вы можете быть удивлены тем, что вы обнаружите.