Специальная обработка nil
означает, что вы можете сделать следующее:
SomeClass * someObject;
someObject = nil;
[someObject doSomething];
И вы можете быть уверены, что ничего не произойдет.
Теперь, почему это важно?
В Objective-C отправка сообщения объекту означает указание этому объекту что-то сделать или запрос об этом объекте для некоторой информации. Некоторые примеры:
[someObject updateRecords]; // 1
x = [someObject size]; // 2
Line 1 посылает сообщение someObject
под названием updateRecords
, а линия 2 посылает один и тот же объект сообщение под названием size
, который, как ожидается, возвращает значение. Эти сообщения сводятся к вызовам методов, а фактический код, который заканчивается запуском, определяется системой времени выполнения Objective-C, поскольку Objective-C является динамически типизированным языком.
Чтобы определить, какой метод вызывать, система времени выполнения считывает информацию с адреса рассматриваемого объекта (someObject
, в приведенных выше примерах), чтобы определить, какой класс является экземпляром. Используя эту информацию, она может искать соответствующий метод для вызова, и когда все, что было выяснено, выполняет код в методе.
Если система времени выполнения не рассматривала nil
в качестве особого случая, она, вероятно, потерпит крах, если вы попытаетесь выполнить код, показанный вверху. nil
определяется как ноль, поэтому среда выполнения начнет считывать информацию из адреса, хранящегося в нулевом местоположении в памяти, что почти гарантировано для нарушения доступа.
Что такое ноль? Вы устанавливаете значение null для метода объекта? или отправить значение null в сообщение? что такое messagE? – Blankman
"nil" - это нулевой объект. Если вы знакомы с Java, «отправка сообщения в nil» эквивалентна «вызову метода на null» в Java, за исключением того, что в Java вы получаете исключение NullPointerException, тогда как в Objective-C ничего не происходит. Таким образом, вы можете смело сделать что-то вроде «[nil doThis: withThis]», и программа не будет разбиваться (метод просто вернет нуль). – mipadi
Не совсем. Nil равно 0, это не объект. Вот почему вы можете сделать то же самое с методами, возвращающими целочисленное значение. Существует специальный объект NSNull, который можно использовать в классах коллекций, но он не равен нулю. –