Как Objective-c обрабатывает сообщения, отправленные на ноль объектов? - PullRequest
3 голосов
/ 29 августа 2011

Я знаю, что можно отправлять сообщение release на ноль объектов. А как насчет других сообщений? Следующий код выводит 0 на консоль. Я хотел бы понять, почему.

NSArray *a = nil;
int i = [a count];
NSLog(@"%d", i);

Вызывает ли когда-либо отправка сообщений nil объектам ошибки?

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

Возвращаемые значения из сообщений в nil объекты гарантированно возвращают эквивалент нуля для скалярных типов возврата, т. Е. nil, 0, 0.0, NO и т. Д.

Смотрите здесь: Отправка сообщений на ноль .

4 голосов
/ 29 августа 2011

objc_msgSend() эффективно отбрасывает сообщения до nil.Если метод имеет тип возврата не void, он вернет что-то вроде nil, то есть 0, NO или 0.0, хотя это не всегда гарантируется для всех возвращаемых типов навсе платформы .Таким образом, единственные ошибки, с которыми вы, вероятно, столкнетесь, это когда ваш объект на самом деле не равен нулю (например, когда это ссылка на освобожденный объект) или когда вы не обрабатываете nil как возвращаемый тип надлежащим образом.

В вашем примере -count возвращает NSUInteger, поэтому значение i будет 0, поскольку objc_msgSend() вернет 0 для сообщения на nil, которое должно вернуть NSUInteger.

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