Хотя ваш код, несомненно, будет вызывать массу методов Objective-C, вероятно, он также будет вызывать и некоторые функции С.

Например, я уже упоминал в главе 1, что обычный способ описания CGPoint, основанный на его значениях х и у, заключается в вызове функции CGPointMake, которая объявлена следующим образом:

CGPoint CGPointMake (
CGFloat х,
CGFloat у
> ;

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

У вас даже могут иметься причины для написания вместо методов собственных функций С как части класса. Функции С имеют более низкие накладные расходы, чем полноценные методы; так что, даже несмотря на отсутствие объектно-ориентированных возможностей методов, иногда полезно писать такие функции, в частности, когда некоторые вспомогательные вычисления должны выполняться быстро и часто.

Кроме того, вы можете встретиться с методами или функциями Cocoa, которые требуют передачи им функции С как “функции обратного вызова”. Примером является метод sorted ArrayUsingFunction: context: класса NSArray. Его первый параметр имеет тип

NSInteger (*) (id, id, void *)

Это выражение с помощью довольно сложного синтаксиса С описывает указатель на функцию, которая принимает три параметра и возвращает NSInteger. Три параметра функции имеют типы id, id и указатель на void (что означает любой указатель С). В языке программирования С как указатель функции может использоваться ее имя (см. главу 1). Таким образом, чтобы вызвать sortedArrayUsingFunction: context:, вам нужно написать функцию С, которая соответствует приведенному описанию, и использовать ее имя в качестве первого аргумента метода.

Для иллюстрации я напишу функцию обратного вызова, которая поможет мне отсортировать массив NSArray строк NSString по последнему символу каждой строки. (Да, это странное решение, но это ведь всего лишь иллюстрация!) Значение NSInteger, возвращаемое функцией, имеет особое значение: оно указывает, меньше ли первый параметр второго, равен ему или больше. Это значение я буду получать с помощью метода compare: класса NSString, который возвращает NSInteger с тем же смыслом. В примере 3.1 определена функция и показано, как должен вызываться метод sortedArrayUsingFunction: contex t: с нашей функцией как функцией обратного вызова.

 

Пример 3.1. Конструкции управления потоком языка программирования С

NSInteger sortByLastCharacter(id stringl, id string2,
void* context) (
NSString* si = stringl;
NSString* s2 = string2;
NSString* stringlend =
[si substringFromlndex:[si length] - 1];
NSString* string2end =
[s2 substringFromlndex:[s2 length] - 1]; return [stringlend compare:string2end];
)
//А вот как используется эта функция (предполагается,
// что агг представляет собой массив NSArray строк NSString)
NSArray* arr2 = [агг
sortedArrayUsingFunction:sortByLastCharacter context:nil];

Похожие статьи

 

 

 

Добавить комментарий