将 self 从 Objective C 传递给 C++,不再重新分配

passing self from Objective C to C++, no more deallocation

我希望有人能帮助我解决我的问题,搜索了很久也没有找到足够的答案。

我正在使用 Objective-C++ 合并 Objective C 和 C++ classes(因为我的项目需要从两种语言继承 classes) .我的主要 class 是一个 Objective-C class 并且我在 C++ 中有一个小助手 class,它在 Objective-C 对象中传递并调用它的函数。

我的问题是,虽然这有效,但没有发生重新分配(或解构)。当我尝试将 Objective-C 对象保存到 class 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

有关详细信息,请参阅 "Advanced Memory Management Programming Guide" 中的 Use Weak References to Avoid Retain Cycles