Использование переменных-указателей на функции в классе Objective-C - PullRequest
1 голос
/ 27 сентября 2010

(плохо знаком с Objective-C, но хорошо разбирается в C / C ++).

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

Я не уверен, как настроить доступ к указанным указателям на функции.

Решение, которое я в настоящее время предполагаю, состоит в том, чтобы объявить указанные указатели функций @public, что, как я понимаю, позволит мне вызывать их с помощью оператора ->. Это кажется мне довольно неудовлетворительным, так как указатели на функции остаются открытыми для вмешательства, и это бросает вызов звуку ООП.

Мое следующее желание - использовать @property и объявлять их только для чтения. Это кажется более вменяемым. Я предполагаю, что вызову их с помощью оператора точки, так как идея использовать getter для получения указателя на функцию, а затем вызывать ее, кажется совершенно нелепой.

Можно ли использовать указатели на функции в качестве свойств? Если да, то как мне объявить эти свойства:

void (*sort)(SET, int) ;
char *(*toASCII)(CARD) ;

У меня такое ощущение, что мне не хватает небольшого нюанса, чтобы объявить их как свойства.

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

В вашем @interface:

@property(readonly) void (*sort)(SET, int);
@property(readonly) char *(*toASCII)(CARD);

В вашем @implementation:

@synthesize sort, toASCII;

В вашем методе init (или там, где вы хотите установить указатели на функции):

sort = someFunction;
toASCII = someFunction;

В современных версиях iOS вам даже не нужно добавлять ивар (он добавляется автоматически при выполнении @synthesize).

1 голос
/ 27 сентября 2010

Я считаю, что вы должны иметь возможность использовать указатели функций в качестве свойств.Вы бы сделали это так:

@property (nonatomic, readonly) char *(*toASCII)(CARD);

А затем в своей реализации:

@synthesize toASCII;

Затем

object.toASCII();
...