передача себя из Objective C в C ++, больше нет освобождения

Я надеюсь, что кто-то может помочь мне с моей проблемой, долго искал и не нашел достаточного ответа.

Я использую Objective-C ++ для объединения классов Objective C и C ++ (так как для моего проекта мне нужно наследовать классы от обоих языков). Мой основной класс — это класс Objective-C, и у меня есть небольшой вспомогательный класс в C ++, который передается в объект Objective-C и вызывает его функции.

Моя проблема в том, что, хотя это работает, не происходит освобождения (или деконструкции). Кажется, что передача self в методе init класса Objective C в класс C ++ создает некоторую блокировку или утечку памяти, когда я пытаюсь сохранить объект Objective C в переменную класса в объекте C ++.

Я использую ARC.

Вот пример кода:

#import <Foundation/Foundation.h>

@interface MyObjCClass : NSObject
@end

int main(int argc, const char * argv[]) {
MyObjCClass *test = [[MyObjCClass alloc] init];
test = nil;
}

class MyCppClass {
public:
MyCppClass(void *test);
~MyCppClass();

private:
void testFunction();
MyObjCClass *myObjCObject;

};MyCppClass::MyCppClass(void *test){
MyObjCClass *obj = (__bridge MyObjCClass *) test;
myObjCObject = obj; //when doing this, there is no more deallocation/deconstruction called
NSLog(@"constructing c++ class");
}

MyCppClass::~MyCppClass(){
NSLog(@"deconstructing c++ class");
}

@implementation MyObjCClass {
MyCppClass *myCppObject;
}

- (instancetype)init
{
if (self) {
NSLog(@"initializing ObjC class");
myCppObject = new MyCppClass((__bridge void *) self);
}
return self;
}

- (void)dealloc
{
delete myCppObject;
NSLog(@"deallocating ObjC class");
}

@end

2

Решение

В

MyCppClass::MyCppClass(void *test){
MyObjCClass *obj = (__bridge MyObjCClass *) test;
myObjCObject = obj; // <-- Creates a strong reference
NSLog(@"constructing c++ class");
}

сильная ссылка на объект создается, и это предотвращает
объект от освобождения. Возможным решением является использование
слабая ссылка вместо:

class MyCppClass {
// ...

private:
void testFunction();
__weak MyObjCClass *myObjCObject; // <-- Weak reference

};

Слабый указатель установлен в nil когда объект освобожден.

Для получения дополнительной информации см. Используйте слабые ссылки, чтобы избежать сохранения циклов в «Расширенном руководстве по программированию управления памятью».

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]