将自我从目标C转移到C ,不再是交易



我希望有人可以帮助我解决我的问题,搜索很长时间,找不到足够的答案。

我正在使用Objective-C 合并目标C和C 类(因为对于我的项目,我需要从两种语言中继承类)。我的主要课程是一个Objective-C类,我在C 中有一个小型助手类,该类在Objective-C对象中通过并调用其功能。

我的问题是,虽然有效,但没有发生交易(或解构)。当我尝试将Objective-C对象保存到C 对象中的类变量时,似乎将自我传递给C 类中的自我会产生某种内存锁定或泄漏。

我正在使用弧。

这是示例代码:

#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

in

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

有关更多信息,请参见使用弱参考,以避免在"高级内存管理编程指南"中保留周期。

最新更新