将 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。
我希望有人能帮助我解决我的问题,搜索了很久也没有找到足够的答案。
我正在使用 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。