मुझे आशा है कि कोई मेरी समस्या के साथ मेरी मदद कर सकता है, लंबे समय तक खोजा और पर्याप्त उत्तर नहीं मिला।

मैं उद्देश्य सी और सी ++ कक्षाओं को मर्ज करने के लिए उद्देश्य-सी ++ का उपयोग कर रहा हूं (क्योंकि मेरी परियोजना के लिए मुझे दोनों भाषाओं से कक्षाएं प्राप्त करने की आवश्यकता है)। मेरा मुख्य वर्ग एक उद्देश्य-सी वर्ग है और मेरे पास सी ++ में एक छोटा सहायक वर्ग है, जो उद्देश्य-सी ऑब्जेक्ट में पास हो जाता है और इसके कार्यों को कॉल करता है।

मेरी समस्या यह है कि जब यह काम करता है, तो कोई डीलोकेशन (या डीकंस्ट्रक्शन) नहीं हो रहा है। ऐसा लगता है कि जब मैं ऑब्जेक्टिव-सी ऑब्जेक्ट को सी ++ ऑब्जेक्ट में क्लास वेरिएबल में सहेजने का प्रयास करता हूं तो सी ++ कक्षा में ऑब्जेक्टिव-सी क्लास इनिट विधि में स्वयं को पास करना किसी प्रकार का मेमोरी लॉक या रिसाव बनाता है।

मैं एआरसी का उपयोग कर रहा हूँ।

यहाँ नमूना कोड है:

#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
2
jfjs 20 फरवरी 2017, 11:41

1 उत्तर

सबसे बढ़िया उत्तर

में

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 पर सेट किया जाता है जब वस्तु को हटा दिया जाता है।

अधिक जानकारी के लिए, देखें रिटेन साइकिल से बचने के लिए कमजोर संदर्भों का उपयोग करें

1
Martin R 20 फरवरी 2017, 11:59