【问题标题】:passing self from Objective C to C++, no more deallocation将 self 从 Objective C 传递到 C++,不再分配
【发布时间】:2017-02-20 08:41:58
【问题描述】:

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

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

我的问题是,虽然这有效,但不会发生解除分配(或解构)。当我尝试将 Objective-C 对象保存到 C++ 对象中的类变量时,似乎将 Objective-C 类 init 方法中的 self 传递给 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

【问题讨论】:

    标签: c++ objective-c memory-management self


    【解决方案1】:

    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

    有关详细信息,请参阅“高级内存管理编程指南”中的Use Weak References to Avoid Retain Cycles

    【讨论】:

      猜你喜欢
      • 2018-01-06
      • 2018-04-09
      • 1970-01-01
      • 2012-09-27
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      相关资源
      最近更新 更多