В чем разница между этими двумя? Если я пишу программу, когда бы мне нужно это:Функция C против метода Objective-C?
void aFunction() {
//do something
}
и когда мне нужно это:
-(void)aMethod {
//do something else
}
В чем разница между этими двумя? Если я пишу программу, когда бы мне нужно это:Функция C против метода Objective-C?
void aFunction() {
//do something
}
и когда мне нужно это:
-(void)aMethod {
//do something else
}
На самом деле, 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 просто потому, что он обеспечивает очень естественный клей между функциями состояния/данных &, основным арендатором объектно-ориентированного программирования.
В 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)
На самом деле в C нет методов, просто автономных функций; последний синтаксис «эквивалентного С», который вы написали, представляет собой синтаксис * C++ * для методов экземпляра. –
Для меня методы и функции - это то же самое. т.е. взаимозаменяемы на языке. Некоторые языки программирования действительно делают различия, но по всем направлениям у вас будут люди, которые используют функцию, где метод подходит, и наоборот. – aqua
@aqua: AFAIK, вы говорите о методах, когда говорите об объектах (http://en.wikipedia.org/wiki/Method_%28computer_programming%29), иначе у вас есть функция или подпрограмма. Тем не менее, моя основная мысль заключалась в том, что последний синтаксис «эквивалентного С», который вы написали, не имеет смысла, потому что в C нет объектов ('struct' не имеют методов экземпляра). Вместо этого это синтаксис, используемый в ** C++ **, например, для методов. –
Первая автономная функция. Второй - метод экземпляра для класса Objective-C. Поэтому, я думаю, вам понадобится вторая версия, если вы на самом деле пишете класс.
free Простое упоминание функции «free» можно было бы смутить с помощью malloc/free. – dcousens
@ Daniel Действительно, я отредактировал свой ответ. –
Очень краткий и полезный. Я помню, что оригинальный C++ был просто препроцессором. – AlanObject