Когда вы отправляете сообщения на ноль, результат всегда равен нулю.Это означает, что это void, nil, zero или false, или что бы это ни значило «оценка нуля в этом контексте».Вы не можете написать код, который это меняет.Это фундаментальная часть того, как работает objc_msgSend
(и тесно связана с тем, как работает диспетчеризация сообщений в ObjC).
Ключевым моментом для понимания является то, что ObjC использует динамическую диспетчеризацию.Он не полагается на типы времени компиляции, чтобы решить, что вызывать.Он отправляет сообщение фактическому объекту, и объект решает, что с ним делать (и это может быть изменено во время выполнения несколькими механизмами).В особом случае объект «nil» (который на самом деле не существует; это просто «указатель на 0x00») всегда возвращает нулевой результат для каждого сообщения.Поэтому во время выполнения не имеет значения, что a
имеет тип NSString*
.Это просто объект, и он отвечает на сообщения, и если он равен нулю, он будет отвечать на сообщения как ноль.
Поэтому ответ «не делайте этого».Идиоматический способ проверки «пустой строки»:
if ([string length] == 0) { ... }
Эта идиома основана на том факте, что [nil length]
вернет 0.