У меня есть библиотека C ++, которую нужно интегрировать в Swift.Я думал, что это работает, пока не понял, что объект C ++ внутри моей оболочки Objective-C был выпущен.
слой C ++
MyCPPClass.hpp
class MyCPPClass {
std:string myString;
int myInt;
}
MyCPPProcessor.hpp
class MyCPPProcessor {
public:
static MyCPPClass getMeACPPClass();
}
MyCPPProcessor.cpp
MyCPPClass MyCPPProcessor::getMeACPPClass() {
CPPClass myCPP;
myCPP.myString = "This is my String";
myInt = 23;
return myCPP;
}
Слой Objective-C
CPPClassWrapper.h
@interface CPPClassWrapper : NSObject
@end
CPPClassWrapper.mm
@interface CPPClassWrapper()
@property MyCPPClass *myCPPClass;
@end
@implementation CPPClassWrapper
-(instancetype) initWithMyCPPClass:(MyCPPClass *)myCPPClass
{
self.myCPPClass = myCPPClass;
return self;
}
@end
MyProcessorWrapper.h
@interface MyProcessorWrapper : NSObject
+(MyClassWrapper *) getMeACPPClass;
@end
MyProcessWrapper.mm
@implementation MyProcessWrapper
+(MyCPPCLassWrapper *) getMeACPPClass
{
MyCPPClass myCPPClass = MyCPPProcessor::getMeACPPClass()
CPPClassWrapper *cppClassWrapper = [[CPPClassWrapper alloc] initWithMyCPPCLass: & myCPPClass];
(1) return cppClassWrapper;
}
@end
К тому времени, как мы достигли строки (1), все будет как положено.У cppClassWrapper есть указатель на myCPPClass, и его можно проверять и проверять.
Но затем, когда он передается на слой Swift, cppClassWrapper.myCPPClass освобождается и его деструктор вызывается.
SwiftСлой
class MyCPPProcessorBridge: MyCPPProcessorWrapper
{
public static func getMeACPPClass -> MyCPPClassBridge
{
let myCPPWrapper:MyCPPClassWrapper = super.getMeACPPClass()
(2) return MyCPPClassBridge(wrapper: myCPPWrapper)
}
}
Когда мы достигаем строки (2), myCPPWrapper потерял свой указатель на myCPPClass, потому что он был освобожден.
Как предотвратить этот выпуск?