在C ++代码中返回Obj-C块

时间:2011-10-08 14:51:10

标签: c++ objective-c c ios objective-c-blocks

我目前正在将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

2 个答案:

答案 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