Я надеюсь, что кто-то может помочь мне с моей проблемой, долго искал и не нашел достаточного ответа.
Я использую 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
В
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
когда объект освобожден.
Для получения дополнительной информации см. Используйте слабые ссылки, чтобы избежать сохранения циклов в «Расширенном руководстве по программированию управления памятью».
Других решений пока нет …