Вернуть блоки Obj-C в коде C ++ - PullRequest
2 голосов
/ 08 октября 2011

В настоящее время я портирую некоторые классы из Apple iOS Foundation Framework на C ++, и я ожидаю некоторых проблем.Я пытаюсь портировать этот метод Obj-C из NSExpression @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

Ответы [ 2 ]

3 голосов
/ 08 октября 2011

Редактировать: Мораль истории, не используйте 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];
}
0 голосов
/ 08 октября 2011

/usr/include/Block.h манипулирует блоками ObjC с помощью непрозрачных указателей void, поэтому, вероятно, вам следует использовать их для передачи их в код C ++, если вы не можете скомпилировать его с помощью блоков, поддерживающих компилятор.Также обратите внимание на функции Block_copy и Block_release в этом заголовке.Также есть статья об управлении памятью блоков ObjC .

...