返回c++代码中的Obj-C块

Return Obj-C blocks in C++ code

本文关键字:Obj-C c++ 代码 返回      更新时间:2023-10-16

我目前正在将一些类从Apple iOS Foundation Framework移植到c++,我预计会出现一些问题。我试图移植这个Obj-C方法从nexpression @class:

- (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

编辑:故事的寓意,在处理块时不要使用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];
}

/usr/include/Block.h使用不透明的void指针操纵ObjC块,所以如果你不能用编译器支持块来编译它,那么这可能是你应该用来将它们传递给c++代码的。还要注意该头文件中的Block_copy和Block_release函数。还有一篇关于ObjC块内存管理的文章