потенциальный цикл сохранения ARC с помощью вспомогательных классов C ++?

Я интегрирую библиотеку C ++ в приложение iOS (Objective C), которое использует абстрактные классы для реализации шаблона обработчика событий.

Чтобы получать события, мне нужно реализовать класс C ++. Если мне чего-то не хватает, я реализую классы C ++ для реализации абстрактных интерфейсов, а затем сохраняю экземпляр класса Objective-C, поэтому я могу вызывать на нем селекторы.

Вот пример

@implementation MYClass : NSObject
{
    CppHelper * _helper;
}

- (id)init
{
    if(self = [super init])
    {
        _helper = new CppHelper(self);
    }
}

- (void)dealloc
{
    delete _helper;
}

@end

...

class CppHelper : public AbstractLibraryInterface
{
private:
    MYClass * _parent;
public:
    CppHelper(MYClass * objCParent)
        : _parent(objCParent)
    { }

    onEvent()
    {
        [_parent handleEvent];
    }
};

Мой вопрос: передача self через конструктор C ++ создает сильную ссылку ARC, так что мои классы ObjC будут держаться за себя?

Может ли использование __bridge void* и сохранение класса ObjC как void* облегчить эту проблему? Время жизни класса C ++ должно быть привязано к родительскому классу ObjC.

Спасибо!


person yano    schedule 25.03.2014    source источник


Ответы (1)


Да, ваше «я» сохраняется в конструкторе CppHelper. Я не люблю ARC за то, что простые указатели становятся сильными. Вы можете определить __weak MYClass * _parent;, чтобы избежать цикла сохранения.

Также почему бы не использовать абстрактные интерфейсы объекта C: @protocol` s?

person Cy-4AH    schedule 26.03.2014
comment
обычно я бы использовал @protocol, но библиотека уже существует, и я должен с ней взаимодействовать - person yano; 26.03.2014