Механизм отправки сообщений имеет фундаментальное значение для Objective-C.

По этой же причине это основной источник проблем. Слишком легко может случиться, что, когда сообщение отправляется объекту, все пойдет не так, как следует. Но как что-то может пойти не так в таком простом и понятном механизме? Что ж, рассмотрим следующее, казалось бы, тривиальное, выражение:

[s uppercaseString]

В этом выражении з представляет собой ссылку, a uppercaseString — сообщение. Сообщение uppercaseString отправляется ссылке s. Что может пойти не так?

Ссылка может указывать на неверный объект

 

Ссылка на объект является указателем

Предполагается, что она указывает на реальный объект. Ссылка — это всего лишь имя. Как из выражения узнать, на что именно указывает s? Вы не видели, каким значением эта ссылка инициализирована. Она может быть равна nil. Это может не быть строка. Это может быть строка, но не та, которую вы ожидаете увидеть. Ссылка может быть ссылкой вовсе не на то, на что вы думаете.

 

Сообщение может быть неверным

Эта возможность идет рука об руку с предыдущей. Если ссылка может быть неверной, то объект, на который она указывает, может не принимать отправленное сообщение. Или объект может принять сообщение, но, будучи не тем объектом, что надо, он может дать неверный результат, отличающийся от того, который вы ожидаете.

 

Это не просто придирки; это распространенная повсеместная реальность. Подавляющее количество вопросов, с которыми я сталкиваюсь в Интернете, о том, почему некоторый код неверно работает, и подавляющее количество ответов на эти вопросы — из-за указанных проблем. Программирование обманчиво; вы можете легко обмануться в своих предположениях. Вы думаете, что знаете, что собой представляют некоторые ссылки, но на самом деле это вовсе не так... В результате выясняется, что все ведет себя не так, как надо, или программа попросту аварийно завершает работу. Понимание, как работает отправка сообщений и что при этом может пойти не так — а я заверяю вас, что это часто так и будет, — это залог успешного написания программы.

В оставшейся части этого раздела мы сосредоточимся на двух особенно коварных причинах, по которым отправка сообщения может пойти не так, как надо: сообщение направляется по ссылке nil и отправляется объекту, которому оно не нравится.


 

 

 

Добавить комментарий