如何在ObjectiveC类中存储函数指针?

时间:2010-10-22 05:57:54

标签: objective-c function-pointers

Apple的一些 obj-c API仍然使用C函数,例如:

  

- (NSArray *)sortedArrayUsingFunction :( NSInteger(*)(id,id,void *))比较器   context:(void *)context

...这很棒,除了我很难看到如何在ObjC类中存储fn指针。

e.g。在程序的不同部分共享相同的“排序”功能。假设您在不同的上下文/类中有不同的数据,但是您希望在两个地方都使用相同的排序(为了保持一致性)。

我确信这很简单,但是我的C太生锈了,或者有一些问题。我尝试在头文件中粘贴一个普通变量:

  

NSInteger(*)(id,id,void *)myComparator;

...我得到的只是编译错误:

  

预期标识符或'('之前')'标记

4 个答案:

答案 0 :(得分:1)

是否真的有必要存储指针?为什么不在函数声明中包含.h,然后传入对函数的引用?

答案 1 :(得分:1)

而不是:

NSInteger (*)(id, id, void *) myComparator;

请改用:

NSInteger (* myComparator)(id, id, void *);

(这就像块语法一样,除了块使用^而不是*

答案 2 :(得分:1)

您可以将函数指针定义为类型(使用typedef),然后在类定义中使用它。例如

在一个共同的标题中:

typedef NSInteger (*COMPARATOR)(id, id, void *);

在第一堂课:

@interface MyClass : NSObject {
    NSObject *anotherField;
    COMPARATOR thecomparator;
}

- (COMPARATOR)comparator;

- (void)setComparator:(COMPARATOR) cmp;

@end

在第二节课中:

@interface MyOtherClass : NSObject {
    NSObject *afield;
    COMPARATOR thecomparator;
}

- (COMPARATOR)comparator;

- (void)setComparator:(COMPARATOR) cmp;

@end

然后将类型COMPARATOR用作任何其他类型。

编辑:我添加了一些方法来展示如何传递和检索函数指针。

答案 3 :(得分:0)

函数指针有点奇怪,因为名称在类型定义中。

如果你想传递一个像这样的方法的函数指针:

- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context;

你会写一个这样的函数:

NSInteger myComparisonFunction(id left, id right, void *context) {
    // do stuff...
}

这样的typedef:

typedef NSInteger (ComparisonFunc *)(id, id, void *);

然后在你的班级中你可以声明一个像这样的实例变量:

ComparisonFunc compFunc;

这样的房产:

@property (nonatomic) ComparisonFunc compFunc;

然后设置您可以调用的属性:

myObject.compFunc = myComparisonFunction;

在myObject中你可以像这样使用它:

sortedArray = [array sortedArrayUsingFunction:compFunc context:NULL];