返回c++代码中的Obj-C块
Return Obj-C blocks in C++ code
我目前正在将一些类从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块内存管理的文章
相关文章:
- 如何在.obj文件上运行IlDasm?
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 在 opengl 中渲染 obj 文件时出现黑窗口
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- 正在读取 obj 文件!(指数)
- 我在主函数的左括号上不断收到错误,消息为obj\Debug\main.o||在函数"ZN11linked_listC1Ev"中:|
- float* 已在 Gameobject.obj 中定义
- 可执行文件C++包括.obj,.lib和.dll吗?
- C++成功复制动态分配的 obj 而不复制 ctor?
- OBJ 文件C++与 ubuntu 问题
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- OBJ 向量到成员函数
- 在istream_iterator中使用后的 C++ FSTREAM obj 回滚
- 使用sscaf_s从obj读取顶点线不起作用
- 移植DXUT SDKMesh以导入OBJ文件,在哪里添加纹理坐标和索引
- /usr/bin/ld: build-debug/obj/gpsitem.o: 文件无法识别: 文件被截断
- 将多个网格放入单个波前 OBJ 文件中
- :-1: 错误: LNK1104: 无法打开文件"我的项目.obj"
- Python 脚本到 c .obj 文件
- MyClass obj = MyClass();'MyClass()'在这里指的是临时对象吗?