Подтвердить что ты не робот

Есть ли способ улавливать сообщения, отправленные на нуль в Objective-C?

Я только что был укушен раздражающей ошибкой которая была неясной поведением "отправить сообщение нильскому в порядке" в Objective-C.

Я видел Отправка сообщения в nil?, и консенсус, похоже, "то, как мы катимся" в Objective-C.

Теперь, может быть, у меня недостаточно опыта в Objective-C, но, похоже, было бы полезно поймать это, потому что я не могу придумать, почему это должно происходить в большинстве случаев. Тем не менее, это может быть просто кодовая идиома, к которой я еще не привык.

Иначе, чем проверка на нуль везде:

assert( object != nil );
[object message];

Есть ли способ сделать это время ловушкой для запуска и предупредить, когда object равен нулю?

4b9b3361

Ответ 2

Служба обмена сообщениями используется в ObjC очень часто. Люди могут бороться, хорошо это или плохо; это просто то, к чему вы должны привыкнуть. Если вы попытаетесь сломать его с помощью трюков, тогда вы собираетесь сломать Cocoa, потому что Cocoa использует его. Есть некоторые трюки (например, опубликованные diciu), которые позволят отлаживать в ситуациях, когда вы подозреваете, что обмен сообщениями отсутствует, но просто не может найти его. Но вы не можете просто оставить их в своем коде (и сообщение в блоге выше делает это понятным). nil обмен сообщениями слишком распространен внутри фреймворков.

В исходном пункте, однако, сравните:

- (void)doSomethingWith:(id)x {
    NSAssert(x != nil, @"Don't pass me nil");
    [x something];
}

против.

void Bar::DoSomething(Foo *x) {
    assert(x != NULL);
    if (x != NULL) {
       x.something;
    }
}

В обоих случаях вам нужно протестировать, и в обоих случаях компилятор не предупредит вас, если вы не сможете проверить. Единственное различие заключается в том, в каких случаях вы терпите крах/утверждаете. Лично я пишу макросы вокруг NSAssert(), которые всегда печатают сообщение журнала, если оно терпит неудачу. Он просто падает только в Debug. Таким образом, когда клиент отправляет мне журналы, я вижу, какие утверждения не удались.