потенциален цикъл на запазване на 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;, за да избегнете цикъла на запазване.

Също защо да не използваме абстрактни интерфейси на object-C: @protocol `s?

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