Objective-C выпускает C ++ Object при передаче в Swift.Как мне предотвратить это? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть библиотека 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, потому что он был освобожден.

Как предотвратить этот выпуск?

1 Ответ

0 голосов
/ 03 декабря 2018

Это не имеет никакого отношения к передаче вашего объекта в Swift.

Проблема в вашем +getMeACPPClass методе.Переменная myCPPClass имеет автоматическое хранение.Он живет в стеке.Когда этот метод возвращается, его пространство стека становится недействительным, и этот объект уничтожается.Ваш класс Objective C CPPClassWrapper содержит только указатель на то же хранилище.Этот указатель остается висящим после уничтожения объекта C ++.

Итак, ваша точка (1) - это точка last , когда эта переменная была действительной.Как только управление возвращается к вызывающей стороне этого метода, оно становится недействительным.

Вам необходимо: 1) выделить объект в куче и использовать std::shared_ptr для управления им, как в +getMeACPPClass, так и CPPClassWrapper;или 2) CPPClassWrapper содержит объект, а не только указатель, и у него будет копия объекта, который был изначально создан в +getMeACPPClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...