@buzzi888

ООП в Objective-C концепция отправки сообщений вместо вызова метода, почему так?

Изучаю Objective-C и не понятна эта концепция, почему в других ооп языках просто вызывается метод экземпляра, а в Objective-C это называется отправкой сообщения. С чем это связано?
В книге(Аарон Хилегасс) написано, что можно использовать оба способа, т.е:
родной [OBJ method:args]
равнозначен OBJ.method(args)
но использовать лучше сообщения и это тоже не ясно.
  • Вопрос задан
  • 4096 просмотров
Пригласить эксперта
Ответы на вопрос 5
FirstX
@FirstX
.net developer
Лично мне кажется, хотя я и сам только начал изучать C-objective, что это всего лишь исторически сложившаяся концепция, которая принципиально на практике ничем не отличается, кроме формы записи.
В теории да, различия есть, что при вызове метода мы сразу переключаемся на исполнение блока кода (метода) этого самого объекта и например попытка переключиться к исполнению кода, когда объект равен null - вызовет проблему.

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

А то, что есть "стандартная" форма записи, то это наследие от C, ведь C-Objective только надмножество над С. Плюс вид записи в сообщениях более читабелен на английском, аргументы не просто списком идут, а гармонично вливаются внутрь наименования метода. Хотя привыкать к такому конечно приходится какое-то время.

Чуть подробнее можно например тут глянуть
Ответ написан
Комментировать
risik
@risik
Программист
Связано это с тем, что парадигма ООП в ObjC взята из SmallTalk.

Тогда (в начале 80-х) этот подход был стильным, модным, молодежным. Например, взаимодействие окон в Windows, истоки которой идут к тому же периоду, построен по точно таком же принципу (хотя здесь люди обошлись без создания своего языка программирования).

С++, хотя он создавался примерно в то же время, был построен по несколько иным принципам. И некоторые "другие" ОО языки программирования (Java и C#) базировались на парадигме ООП в С++, а не в SmallTalk. Хотя некоторые концепции позже перекочевали и в эти ОО языки.
Ответ написан
Комментировать
GxocT
@GxocT
Если вкратце, то при отправке сообщения вызывается C функция с переданными параметрами.

Подробнее тут:
blog.zhengdong.me/2013/07/18/a-look-under-the-hood...

И тут, страница 37 и далее:
www.defcon.org/images/defcon-16/dc16-presentations...
Ответ написан
Комментировать
@s0L
В книге(Аарон Хилегасс) написано, что можно использовать оба способа, т.е:
родной [OBJ method:args]
равнозначен OBJ.method(args)
но использовать лучше сообщения и это тоже не ясно.


Квадратные скобки - это вызов метода/отправка сообщения.
Через точку - это обращение к property. У property обязательно есть getter и setter, и название метода getter по умолчанию совпадает с названием property, поэтому такая конструкция работает.

Идеологически конечно лучше не вызывать методы через obj.method, чтобы не вносить путаницу. Методы нужно вызывать [obj method], а к property обращаться obj.propertyName
Ответ написан
Комментировать
Потому что там нет компилированных "классов" как таковых, есть лишь список методов (в текстовом виде) и соответствие их функциям. Методы в objc это обычные C функции (типа IMP) с дополнительными параметрами self и _cmd.
Классы это просто структуры с перечислением пропертей, методов, ivars, суперкласса и все остальное, а вызов метода происходит через поиск функции, соответсвующей селектору (сообщению)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы