मुझे आशा है कि कोई मेरी समस्या के साथ मेरी मदद कर सकता है, लंबे समय तक खोजा और पर्याप्त उत्तर नहीं मिला।
मैं उद्देश्य सी और सी ++ कक्षाओं को मर्ज करने के लिए उद्देश्य-सी ++ का उपयोग कर रहा हूं (क्योंकि मेरी परियोजना के लिए मुझे दोनों भाषाओं से कक्षाएं प्राप्त करने की आवश्यकता है)। मेरा मुख्य वर्ग एक उद्देश्य-सी वर्ग है और मेरे पास सी ++ में एक छोटा सहायक वर्ग है, जो उद्देश्य-सी ऑब्जेक्ट में पास हो जाता है और इसके कार्यों को कॉल करता है।
मेरी समस्या यह है कि जब यह काम करता है, तो कोई डीलोकेशन (या डीकंस्ट्रक्शन) नहीं हो रहा है। ऐसा लगता है कि जब मैं ऑब्जेक्टिव-सी ऑब्जेक्ट को सी ++ ऑब्जेक्ट में क्लास वेरिएबल में सहेजने का प्रयास करता हूं तो सी ++ कक्षा में ऑब्जेक्टिव-सी क्लास इनिट विधि में स्वयं को पास करना किसी प्रकार का मेमोरी लॉक या रिसाव बनाता है।
मैं एआरसी का उपयोग कर रहा हूँ।
यहाँ नमूना कोड है:
#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
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
पर सेट किया जाता है जब वस्तु को हटा दिया जाता है।
अधिक जानकारी के लिए, देखें रिटेन साइकिल से बचने के लिए कमजोर संदर्भों का उपयोग करें।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।