带C+的Swift中的takeRetainedValue()或takeUnretainedValue()+;图书馆 我正在使用一个C语言包,用C++编写的快速项目。p>

带C+的Swift中的takeRetainedValue()或takeUnretainedValue()+;图书馆 我正在使用一个C语言包,用C++编写的快速项目。p>,c++,c,swift,C++,C,Swift,该库为您提供了同步和异步获取/设置变量的可能性 库作为回调方法,通知何时甚至已经发生 我在swift中具有以下功能: /*** Convert const void* To Any T ***/ func bridgeToTypeRetained<T : AnyObject>(ptr : UnsafeMutableRawPointer) -> T { return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue

该库为您提供了同步和异步获取/设置变量的可能性

  • 库作为回调方法,通知何时甚至已经发生

  • 我在swift中具有以下功能:

    /*** Convert const void* To Any T ***/
    
    func bridgeToTypeRetained<T : AnyObject>(ptr : UnsafeMutableRawPointer) -> T {
       return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue()
    }
    
    func bridgeToTypeUnretained<T : AnyObject>(ptr : UnsafeRawPointer) -> T {
       return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue()
    }
    
    然后在swift中,我使用以下代码:

     CpProxyAvOpenhomeOrgInfo1SetPropertyTrackCountChanged(myHandle, { (pointer) in
    
     if pointer != nil{
        let myClass:MyClass = bridgeToTypeRetained(ptr: pointer!)
        myClass.aValu = 0 //CRASH BAD ACCESS
        let myClass:MyClass = bridgeToTypeUnretained(ptr: pointer!)
        myClass.aValu = 0 //NO CRASH
     }
    
     }, bridgeToPointerRetained(obj: self))
    
    对于实现异步操作,在库中我有以下定义:

    DllExport void STDCALL CpProxyAvOpenhomeOrgInfo1SetPropertyTrackCountChanged(THandle aHandle, OhNetCallback aCallback, void* aPtr);
    
    typedef void (STDCALL *OhNetCallback)(void* aPtr);
    
    DllExport void STDCALL CpProxyAvOpenhomeOrgInfo1BeginCounters(THandle aHandle, OhNetCallbackAsync aCallback, void* aPtr);
    
    typedef void (STDCALL *OhNetCallbackAsync)(void* aPtr, OhNetHandleAsync aAsync);
    
    然后我使用下面的代码

        let classCallback = ClassCallback()
        classCallback.classObject = self
    
        CpProxyAvOpenhomeOrgInfo1BeginCounters(prxHandleId, { (pointer, ohNetAsync) in
    
            if pointer != nil && ohNetAsync != nil{
    
                let classCallback : ClassCallback = bridgeToTypeRetained(ptr: pointer!)
                classCallback.classObject.aValue = 1 //NO CRASH
    
            }
    
    
        }, bridgeToPointerRetained(obj: classCallback))
    
    所以我的问题是:

      <> Li >我必须使用TAKETETIN EDIVE()还是TununRealEdValueAd()根据我可以从C++库获得?

    谢谢。

    如果希望
    ClassCallback
    存在,即使所有对它的Swift引用都消失了,也需要传入一个保留值,这会造成内存泄漏,而没有添加正确的清理逻辑。如果您传递了一个未恢复的值,那么当您试图取回
    ClassCallback
    时,如果所有swift引用都消失了,您将崩溃

    在回调中,如果希望对象继续存在且当前引用计数位于作用域末尾,则可以获取未恢复的引用以获取该对象。如果采用保留引用,引用计数将减少并销毁该对象(如果该对象是最后一个引用)


    我通常要做的是传入一个保留的引用并获取一个未保留的引用,直到我准备好处理回调对象为止。当发生这种情况时,我会使用上下文指针的保留值(
    aPtr
    ,在您的情况下)来平衡保留的过程,并用新的适当值替换它。

    如果您希望
    类回调
    存在,即使所有对它的Swift引用都消失了,也需要传递保留值,这会在没有添加正确的清理逻辑的情况下创建内存泄漏。如果您传递了一个未恢复的值,那么当您试图取回
    ClassCallback
    时,如果所有swift引用都消失了,您将崩溃

    在回调中,如果希望对象继续存在且当前引用计数位于作用域末尾,则可以获取未恢复的引用以获取该对象。如果采用保留引用,引用计数将减少并销毁该对象(如果该对象是最后一个引用)


    我通常要做的是传入一个保留的引用并获取一个未保留的引用,直到我准备好处理回调对象为止。当发生这种情况时,我将使用上下文指针的保留值(
    aPtr
    ,在您的情况下)来平衡保留的过程,并用新的适当值替换它。

    这不是C。。它是C++或C i猜测。对不起,我要更改标签,这不是C。它是C++或C i猜测。抱歉,我去改变标签,然后我看到,我一直在做一些测试,我或多或少假设它是这样的,但这种解释使它更容易理解!谢谢,我知道了,我一直在做一些测试,我或多或少地认为是这样的,但这种解释让它更容易理解!非常感谢。
        let classCallback = ClassCallback()
        classCallback.classObject = self
    
        CpProxyAvOpenhomeOrgInfo1BeginCounters(prxHandleId, { (pointer, ohNetAsync) in
    
            if pointer != nil && ohNetAsync != nil{
    
                let classCallback : ClassCallback = bridgeToTypeRetained(ptr: pointer!)
                classCallback.classObject.aValue = 1 //NO CRASH
    
            }
    
    
        }, bridgeToPointerRetained(obj: classCallback))