Сообщения в стиле Smalltalk против функций в стиле C - PullRequest
15 голосов
/ 05 мая 2009

Когда я должен использовать сообщения вместо функций в стиле C?

Ответы [ 3 ]

21 голосов
/ 05 мая 2009

Objective-c делает это различие для вас. Сообщения должны отправляться объектам, но функции можно использовать в любое время.

сообщения

Сообщения Objective-C могут отправляться только объектам, а система обмена сообщениями позволяет совершать вызовы методов класса.

Пример:

// a class interface definition
// including a method named aMethod
@interface ANObject
{

}
- (void)aMethod;
@end


// a message sent to that object:
ANObject * myObject = [[ANObject alloc] init];
[myObject aMethod]; // <-- message
[myObject release];

функции

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

Пример: * * тысяча двадцать-восемь

// a regular C-style function
void someFunction(ANObject * argument)
{
    // do something here...
}


// and how to call it:
someFunction(someObject);

когда использовать каждый?

Используйте messages / method , когда вы хотите получить доступ к некоторой собственности на объект / класс. Хорошими примерами будет доступ к длине строки NSString:

int stringLength = [myString length];

Установка значения свойства:

[myObject setHidden:YES];

Или указание объекту выполнить какое-либо задание:

[myAccount withdrawMoneyAndDriveToMexico];

Используйте C-style functions , когда вы хотите выполнить задачу, которая не принадлежит классу; то, что должно стоять в одиночестве. Хорошими примерами могут быть математические функции, такие как:

double degrees = ConvertRadiansToDegrees(radians);
4 голосов
/ 05 мая 2009

В основном, используйте сообщения каждый раз, когда имеете дело с компонентом Objective C; более или менее каждый раз, когда вы используете тип NS *.

Под прикрытием вы, по сути, используете вызовы функций C в любом случае; Первоначальная реализация Objective C была препроцессором для C. Но весь смысл использования Objective C состоит в том, чтобы получить синтаксис Smalltalk, который есть у вас где-нибудь внутри [].

2 голосов
/ 05 мая 2009

Вы задали много вопросов по Java; возможно, аналогия с Java поможет. Где можно использовать метод в Java, используйте сообщение в Objective-C. Где можно использовать статический метод в Java, используйте метод класса в Objective-C. Если вы обнаружите, что создаете служебные пакеты в Java, которые полны статических методов, это может быть полезно в Objective-C как функция.

И, конечно, это может иметь смысл, если вы делаете странные вещи с Objective-C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...