我目前正在将Apple iOS Foundation Framework中的一些类移植到C ++中,我期待一些问题。我正试图从NSExpression @class中导出这个Obj-C方法:
- (id, NSArray *, NSMutableDictionary *)expressionBlock
所以在我的sfExpression类中,我有以下代码(删除其他方法时^^)
class sfExpression : public sfObject {
public:
id (^ExpressionBlock())(id, NSArray*, NSMutableDictionary*);
private:
NSExpression* _Expression;
};
当我试图像这样实现这个功能时:
id (^sfExpression::ExpressionBlock())(id, NSArray*, NSMutableDictionary*) {
return [_Expression expressionBlock];
}
它不起作用......有什么想法吗?
我尝试过很多东西,但是......没有成功:'(
编辑:代码是对的。只需切换到LLVM编译器而不是GCC
答案 0 :(得分:3)
编辑:故事的道德,在处理积木时不要使用GCC。
就我所见,这是一个完整的例子,这在我的测试中有用。
class Foo
{
public:
Foo(NSExpression *_exp) : expression([_exp retain])
{
}
~Foo()
{
[expression release];
}
id (^ExpressionBlock())(id, NSArray*, NSMutableDictionary*);
private:
NSExpression *expression;
};
id (^Foo::ExpressionBlock())(id, NSArray*, NSMutableDictionary*)
{
return [expression expressionBlock];
}
int main()
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
Foo a([NSExpression expressionForBlock:^id(id evaluatedObject, NSArray *expressions, NSMutableDictionary *context) {
return evaluatedObject;
} arguments:[NSArray arrayWithObject:@"Test"]]);
NSLog(@"%@", a.ExpressionBlock()(@"Hello", nil, nil));
[pool drain];
}
答案 1 :(得分:0)
/usr/include/Block.h
使用opaque void指针操作ObjC块,因此如果你不能用编译器支持块编译它,那么你应该使用它来将它们传递给C ++代码。另请注意该标头中的Block_copy和Block_release函数。还有an article on memory management of ObjC blocks。