दिलचस्प पोस्ट
सीएसएस चयनकर्ताओं में वर्ग के नाम संवेदनशील हैं? फायरबेज में, क्या सभी नोड डेटा को लोड किए बिना नोड के बच्चों की संख्या प्राप्त करने का कोई तरीका है? आपको C ++ में 'मित्र' का उपयोग कब करना चाहिए? बिटवर्ड या 0 से फर्श पर नंबर का उपयोग करना Moq के साथ विस्तार विधियों का मजाक उड़ाका jquery का उपयोग कर तत्व अतिप्रवाह का पता लगा सकता है अजगर में डिफ़ॉल्ट अनुप्रयोग के साथ दस्तावेज़ खोलें बाश में, मैं कैसे जांच सकता हूँ अगर कोई स्ट्रिंग कुछ मान से शुरू होती है? HTML को पार्स करने के लिए नियमित अभिव्यक्ति का उपयोग करना: क्यों नहीं? कोड से जावा स्विंग एप्लिकेशन को बंद कैसे करें क्रोम एक्सटेंशन – DOM सामग्री प्राप्त करें आप String.substringWithRange का उपयोग कैसे करते हैं? (या, रेंज कैसे स्विफ्ट में काम करते हैं?) समूह के सारांश आंकड़े कैसे प्राप्त करें रेज़र और जावास्क्रिप्ट कोड को मिलाएं C # कंसोल अनुप्रयोग की कंसोल विंडो को छुपाएं / छिपाएं

एआरसी में पॉइंट-टू-पॉइंटर स्वामित्व के मुद्दों को संभालना

मान लें वस्तु ए की कोई संपत्ति है:

@property (nonatomic, strong) Foo * bar; 

कार्यान्वयन में संश्लेषित:

 @synthesize bar = _bar; 

ऑब्जेक्ट बी Foo ** , जैसा कि इस उदाहरण में ऑब्जेक्ट ए से कॉल किया जाता है:

 Foo * temp = self.bar; [objB doSomething:&temp]; self.bar = temp; 
  • क्या यह, या कुछ इसी तरह, वैध तरीके से किया जा सकता है?
  • doSomething: लिए सही घोषणा क्या है doSomething: विधि?

इसके अलावा, मान लें कि ऑब्जेक्ट बी को bar संपत्ति सेट करने का मौका देने से पहले इसे रद्द कर दिया जा सकता है (और इस प्रकार temp से इंगित होने वाले उदाहरण के स्वामित्व पर) – मैं अपने मालिक संदर्भ को कैसे सौंपने के लिए एआरसी को बताऊंगा? दूसरे शब्दों में, अगर मैं निम्नलिखित उदाहरण स्निपेट को काम करना चाहता हूं, तो मुझे एआरसी मुद्दों को कैसे संभालना होगा?

 Foo * temp = self.bar; // Give it a reference to some current value [objB doSomething:&temp]; // Let it modify the reference self.bar = nil; // Basically release whatever we have _bar = temp; // Since we're getting back an owning reference, bypass setter 
  • मैं क्या सोच रहा हूँ?

संपादित करें

@ केविनब्लॉर्ड के उत्तर के आधार पर, मैं बस अपनी समझ की पुष्टि करना चाहता हूं क्या ये सही है?

ऑब्जेक्ट ए:

 @implementation ObjectA @synthesize bar = _bar; - (void)someMethod { ObjectB * objB = [[ObjectB alloc] initWithFoo:&_bar]; // objB handed off somewhere and eventually it's "doSomething" method is called. } @end 

ऑब्जेक्ट बी:

 @implementation ObjectB { Foo * __autoreleasing * _temp; } - (id)initWithFoo:(Foo * __autoreleasing *)temp { id self = [super init]; if (self) { _temp = temp; } return self; } - (void)doSomething { ... *_temp = [[Foo alloc] init]; ... } @end 

इससे एक संकलन-समय त्रुटि उत्पन्न होती है: passing address of non-local object to __autoreleasing parameter for write-back

वेब के समाधान से एकत्रित समाधान "एआरसी में पॉइंट-टू-पॉइंटर स्वामित्व के मुद्दों को संभालना"

यह पूरी तरह वैध है संपत्ति का उपयोग अप्रासंगिक है; ऑब्जेक्ट के लिए एक पॉइंटर गुजर रहा है आमतौर पर NSError* ऑब्जेक्ट्स के साथ किया जाता है।

आपकी विधि घोषित करने का सही तरीका है

 - (returntype)doSomething:(Foo * __autoreleasing *)arg; 

यह एक __autoreleasing ऑब्जेक्ट के लिए एक संकेतक के रूप में घोषित करता है, जिसका मूल रूप से मतलब है कि ऑब्जेक्ट को इंगित किया गया है -autorelease डी।

"इसके अलावा" के लिए, यह एआरसी के तहत एक मुद्दा नहीं है आपकी लाइन

 Foo * temp = self.bar; 

के बराबर है

 __strong Foo *temp = self.bar; 

जो मुझे आशा है कि आप के लिए स्पष्ट है कि यह एक मजबूत संदर्भ temp बनाता है, और इस प्रकार यह "मूल्य" के रूप में जब तक चर मौजूद है दूसरे शब्दों में, आप कह सकते हैं

 Foo *temp = self.bar; self.bar = nil; 

और temp अभी भी वैध है।