Является ли if (переменная) такой же, как если бы (переменная! = Ноль) в Objective-C - PullRequest
7 голосов
/ 11 февраля 2009

Я получаю EXC_BAD_ACCESS (SIGBUS) по этой строке в моем проекте iPhone:

if (timeoutTimer) [timeoutTimer invalidate];

Что меня озадачило, так это то, что я не понимаю, как может произойти сбой этой строки, поскольку оператор if предназначен для проверки на ноль. Я неправильно понимаю, как работает Objective-C, или номера строк в операторах сбоя иногда содержат неправильную строку?

Ответы [ 3 ]

16 голосов
/ 11 февраля 2009

То, что для переменной задано значение, отличное от nil, не означает, что оно указывает на допустимый объект. Например:

id object = [[NSObject alloc] init];
[object release];
NSLog(@"%@", object); // Not nil, but a deallocated object,
                      // meaning a likely crash

Ваш таймер, вероятно, уже был удален (или, возможно, не был создан вообще?), Но переменная не была установлена ​​в ноль.

6 голосов
/ 13 ноября 2009

Я только что столкнулся с подобной проблемой, так что вот еще один пример того, что может привести к сбою такой проверки, как ваша.

В моем случае я получал значение из словаря, например:

NSString *text = [dict objectForKey:@"text"];

Позже я использовал переменную, подобную этой:

if (text) {
    // do something with "text"
}

Это привело к ошибке EXC_BAD_ACCESS и падению программы.

Проблема заключалась в том, что мой словарь использовал значения NSNull в тех случаях, когда объект имел пустое значение (оно было десериализовано из JSON), поскольку NSDictionary не может содержать значения nil. Я закончил работать вокруг этого так:

NSString *text = [dict objectForKey:@"text"];
if ([[NSNull null] isEqual:text]) {
    text = nil;
}
0 голосов
/ 11 февраля 2009

Они должны быть одинаковыми. Возможно, номер строки на самом деле неверен.

Найдите другие возможные ошибки в коде и посмотрите, найдете ли вы что-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...