В Java, если вы сделали это:
Foo foo = null;
int bar foo.getBar();
Вы получите исключение нулевого указателя.В Objective-C совершенно нормально отправлять сообщения на nil
, это рассматривается как запрет, ничего не делается.
С небольшой оговоркой;методы с возвращаемыми типами, размер которых соответствует принятым ABI соглашениям о возвращении по умолчанию, будут возвращать значение, равное представлению типов данных nil
.Так что все это сработает и даст ожидаемые возвращаемые значения:
Foo* foo = nil;
id a = [foo objectValue]; // a will be nil
BOOL b = [foo boolValue]; // b will be NO
int c = [foo intValue]; // c will be 0
float d = [foo floatValue]; // d will be 0.0f
Это может иметь большие преимущества для вашего кода, представьте себе этот пример:
if ([myString length] > 0) {
// Do stuff here
}
Таким образом, не имеет значения, еслиmyString
- пустая строка, или просто nil
.Запрашиваемая длина вернет 0
в обоих случаях.Упрощение записи многих операций, поскольку редко приходится учитывать значение nil
.
Только для возвращаемых типов, таких как структуры, которые не помещаются в регистр возврата, вы не получите определенное возвращаемое значение:
Foo* foo = nil;
CGRect a = [foo rectValue]; // content of a will be undefined.