我希望有人可以帮助我解决我的问题,搜索很长时间,找不到足够的答案。
我正在使用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
。
有关更多信息,请参见使用弱参考,以避免在"高级内存管理编程指南"中保留周期。