Отправка сообщения на ноль в Objective-C - PullRequest
103 голосов
/ 01 октября 2008

Как Java-разработчик, который читает документацию Apple Objective-C 2.0: мне интересно, что означает " отправка сообщения на nil " - не говоря уже о том, как это действительно полезно. Взятие выдержки из документации:

Есть несколько моделей в какао что воспользоваться этим фактом. значение, возвращаемое из сообщения в ноль также может быть действительным:

  • Если метод возвращает объект, любой тип указателя, любой целочисленный скаляр размером меньше или равно sizeof (void *), поплавок, двойной, длинный двойной или длинный длинный, то сообщение, отправленное на ноль, возвращает 0.
  • Если метод возвращает структуру, как определено в ABI-функции Mac OS X Руководство по вызову будет возвращено в регистрируется, затем сообщение отправляется на ноль возвращает 0.0 для каждого поля в структура данных. Другие данные структуры типы не будут заполнены нулями.
  • Если метод возвращает что-либо кроме указанного выше значения набирает возвращаемое значение сообщения отправлено на ноль не определено.

Сделала ли Ява моим мозгом неспособность уловить объяснение выше? Или что-то, чего мне не хватает, сделает это ясным, как стекло?

Я понял идею сообщений / получателей в Objective-C, я просто запутался в том, что получатель nil.

Ответы [ 11 ]

2 голосов
/ 24 ноября 2014

C ничего не представляет как 0 для примитивных значений и NULL для указателей (что эквивалентно 0 в контексте указателя).

Objective-C основан на представлении C ничего, добавляя ноль. nil - это указатель на объект. Хотя они семантически отличаются от NULL, они технически эквивалентны друг другу.

Вновь выделенные NSObjects начинают жизнь с их содержимым, установленным в 0. Это означает, что все указатели, которые объект имеет на другие объекты, начинаются как nil, поэтому нет необходимости, например, устанавливать self. (Association) = nil in методы init.

Самым заметным поведением nil является то, что ему могут отправляться сообщения.

В других языках, таких как C ++ (или Java), это может привести к сбою вашей программы, но в Objective-C вызов метода для nil возвращает нулевое значение. Это значительно упрощает выражения, поскольку устраняет необходимость проверять nil перед тем, как что-либо делать:

// For example, this expression...
if (name != nil && [name isEqualToString:@"Steve"]) { ... }

// ...can be simplified to:
if ([name isEqualToString:@"Steve"]) { ... }

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

Источник: http://nshipster.com/nil/ https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocObjectsClasses.html (отправка сообщения на ноль).

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