Функция C против метода Objective-C? - PullRequest
37 голосов
/ 31 января 2011

В чем разница между двумя? Если я пишу программу, когда мне нужно это:

void aFunction() {
    //do something
}

и когда мне это понадобится:

-(void)aMethod {
    //do something else
}

Ответы [ 3 ]

79 голосов
/ 31 января 2011

На самом деле, метод 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 изначально был реализован как не что иное, как препроцессор Си. Все, что вы можете сделать в Objective-C , можно переписать как прямое C.

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

<Ч />

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

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

9 голосов
/ 31 января 2011

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

[myObject myFunction]

Метод AC имеет вид:

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

Метод Objective C instance имеет вид:

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

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

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

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

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

2 голосов
/ 31 января 2011

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

...