2011-01-31 4 views

ответ

77

На самом деле, Objective-C-метод - это просто функция C с двумя аргументами, всегда присутствующими в начале.

Это:

-(void)aMethod; 

точности эквивалентен следующему:

void function(id self, SEL _cmd); 

Objective-C сообщения таково, что это:

[someObject aMethod]; 

точности эквивалентен этому (почти - - существует вариационный аргумент ABI, выходящий за рамки этого ответа):

objc_msgSend(someObject, @selector(aMethod)); 

objc_msgSend() находит соответствующую реализацию метода (путем поиска на someObject), а затем, с помощью магии оптимизации хвостового вызова, переход к реализации метода, который для всех намерений и целей , работает точно так же, как вызов функции C, которая выглядит следующим образом:

function(someObject, @selector(aMethod)); 

в буквальном смысле слова, Objective-C был первоначально реализован лишь как C препроцессором. Все, что угодно вы можете сделать в Objective-C, можно переписать как прямой C.

Выполнение этого, однако, было бы полной болью в заднице и не стоило бы вашего времени за пределами невероятно образовательного опыта этого.


В общем, вы используете методы Objective-C при общении с объектами и функции при работе с прямым C goop. Учитывая, что почти все Mac OS X и iOS предоставляют API Objective-C - безусловно, полностью для точек входа программирования уровня пользовательского интерфейса - тогда вы используете Obj-C большую часть времени.

Даже при написании собственного кода уровня модели, который является относительно автономным, вы обычно используете Objective-C просто потому, что он обеспечивает очень естественный клей между функциями состояния/данных &, основным арендатором объектно-ориентированного программирования.

+0

Очень краткий и полезный. Я помню, что оригинальный C++ был просто препроцессором. – AlanObject

9

В Objective-C каждая функция работает на объекта, как

[myObject myFunction]

метод переменного тока имеет вид:

return-type function-name(argument1, argument2, etc) {}

экземпляр метод Objective-C имеет вид:

-(return-type)function-name:argument1 {}

или для функции мульти-аргумента

-(return-type)function-name:argument1 function-name:argument2 {}

Я всегда использовать Objective-C -style при программировании Obj-C, хотя вы также можете использовать функции C-типа.

Я полагаю, что эквивалент C до [myObject myMethod:arg] может быть myObject.myMethod(arg)

+6

На самом деле в C нет методов, просто автономных функций; последний синтаксис «эквивалентного С», который вы написали, представляет собой синтаксис * C++ * для методов экземпляра. –

+0

Для меня методы и функции - это то же самое. т.е. взаимозаменяемы на языке. Некоторые языки программирования действительно делают различия, но по всем направлениям у вас будут люди, которые используют функцию, где метод подходит, и наоборот. – aqua

+4

@aqua: AFAIK, вы говорите о методах, когда говорите об объектах (http://en.wikipedia.org/wiki/Method_%28computer_programming%29), иначе у вас есть функция или подпрограмма. Тем не менее, моя основная мысль заключалась в том, что последний синтаксис «эквивалентного С», который вы написали, не имеет смысла, потому что в C нет объектов ('struct' не имеют методов экземпляра). Вместо этого это синтаксис, используемый в ** C++ **, например, для методов. –

2

Первая автономная функция. Второй - метод экземпляра для класса Objective-C. Поэтому, я думаю, вам понадобится вторая версия, если вы на самом деле пишете класс.

+0

free Простое упоминание функции «free» можно было бы смутить с помощью malloc/free. – dcousens

+0

@ Daniel Действительно, я отредактировал свой ответ. –

Смежные вопросы