मैं एक उद्देश्य-सी पृष्ठभूमि से सी ++ 11 पर आया हूं, और एक चीज जिसके साथ मैं आने के लिए संघर्ष कर रहा हूं वह सी ++ 11 के विभिन्न कैप्चरिंग अर्थशास्त्र है लैम्बडा बनाम उद्देश्य-सी "ब्लॉक"। (तुलना के लिए here देखें)।सी ++ 11 लैम्बडास को असीमित रूप से उपयोग करके, सुरक्षित रूप से
उद्देश्य-सी में, सी ++, self
/this
पॉइंटर को निश्चित रूप से कैप्चर किया गया है यदि आप किसी सदस्य चर का संदर्भ लेते हैं। लेकिन क्योंकि ऑब्जेक्टिव-सी में सभी वस्तुओं को प्रभावी ढंग से "साझा संकेत", सी ++ शब्दावली का उपयोग करने के लिए हैं, तो आप ऐसा कर सकते हैं:
doSomethingAsynchronously(^{
someMember_ = 42;
});
... और आप की गारंटी कर रहे हैं कि वस्तु जिसका सदस्य आप तक पहुँच रहे हैं ब्लॉक निष्पादित होने पर जीवित रहेगा। आपको इसके बारे में सोचना नहीं है।
// I'm assuming here that `this` derives from std::enable_shared_from_this and
// is already owned by some shared_ptr.
auto strongThis = shared_from_this();
doSomethingAsynchronously([strongThis, this] {
someMember_ = 42; // safe, as the lambda holds a reference to this
// via shared_ptr.
});
यहाँ आप इस सूचक के अलावा shared_ptr कब्जा करने के लिए याद करने की आवश्यकता: सी ++ में बराबर की तरह कुछ हो रहा है। क्या इसे प्राप्त करने में कुछ कम त्रुटि-प्रवण तरीका है?
* "आपको इसके बारे में सोचना नहीं है।" * इसके बारे में सोचना शुरू करें। यह बेहतर डिजाइन की ओर जाता है। – Pubby
@ पब्बी लेकिन बात यह है कि, यह उन ब्लॉकों का उपयोग करने की सहजता है जो उन्हें ओब्जे-सी दुनिया में एक-शॉट असीमित कार्यों के लिए इतना उपयोगी और व्यापक बनाता है। अगर उनके पास सी ++ 11 अर्थशास्त्र था, और आपको खुद से पूछना था, "क्या यह वस्तु जीवित रहेगी, क्या यह वस्तु जीवित रहेगी, क्या यह वस्तु जीवित रहेगी ..." हर बार, मुझे लगता है कि बहुत से लोग लुभाने लगे होंगे कहो "इसे पेंच करो, मैं इसे तुल्यकालिक रूप से करूँगा।" –
'इस' से साझा सूचक बनाने से यह गारंटी नहीं है कि यह अभी भी मौजूद रहेगा, जब तक कि ऑब्जेक्ट का पहले से ही किसी साझा सूचक द्वारा स्वामित्व न हो और आप इसकी प्रतिलिपि बना रहे हों। एक नया साझा पॉइंटर बनाना ('new shared_ptr (यह) 'या' make_shared (यह)') केवल डबल-डिलीट प्राप्त करने के लिए काम करेगा, जब तक कि स्मृति अन्यथा लीक न हो जाए। इसलिए, यदि आप इस बिंदु पर साझा सूचक नहीं बनाते हैं, तो आपके मामले में, यह कैसे हटाया जाता है? –
Agentlien