Apple的一些 obj-c API仍然使用C函数,例如:
- (NSArray *)sortedArrayUsingFunction :( NSInteger(*)(id,id,void *))比较器 context:(void *)context
...这很棒,除了我很难看到如何在ObjC类中存储fn指针。
e.g。在程序的不同部分共享相同的“排序”功能。假设您在不同的上下文/类中有不同的数据,但是您希望在两个地方都使用相同的排序(为了保持一致性)。
我确信这很简单,但是我的C太生锈了,或者有一些问题。我尝试在头文件中粘贴一个普通变量:
NSInteger(*)(id,id,void *)myComparator;
...我得到的只是编译错误:
预期标识符或'('之前')'标记
答案 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];