2012-12-06 6 views
7

निम्न पर विचार करें: उद्देश्य-सी वर्ग का एक उदाहरण एक मजबूत संदर्भ और एक कमजोर संदर्भ (एआरसी के तहत) द्वारा संदर्भित किया जाता है। थ्रेड एक्स पर, कमजोर संदर्भ के माध्यम से उदाहरण पर एक विधि कहा जाता है। थ्रेड वाई पर, मजबूत संदर्भ टूट गया है कि उदाहरण के लिए कोई और मजबूत संदर्भ नहीं हैं, और इसे हटा दिया जाना चाहिए।क्या ऑब्जेक्टिव-सी ऑब्जेक्ट को डिलीकेट किया जा सकता है जबकि उस पर एक इंस्टेंस विधि लागू की जा रही है?

क्या यह स्थिति संभव है, इस बात को थ्रेड वाई पर हटाया जा सकता है जबकि विधि थ्रेड एक्स पर निष्पादित हो रही है? इसी तरह, जब तक विधि वापस नहीं आती है तब तक ऑब्जेक्ट 'रीटेन' पर एक विधि का आह्वान करता है?

उत्तर

10

एआरसी वास्तव में उन पर उदाहरण विधियों को कॉल करने से पहले कमजोर संदर्भ बनाए रखता है, और कॉल के बाद रिलीज़ करता है।

मैं इस मुद्दे पर शोध कर रहा था और उसे इस स्टैक ओवरफ्लो प्रश्न को दिखाने के बाद एक सहयोगी द्वारा सही किया गया था। उन्होंने इस पर ध्यान दिया: http://lists.apple.com/archives/objc-language/2012/Aug/msg00027.html

निश्चित रूप से, असेंबली में, एआरसी एक कमजोर संदर्भ पर एक आमंत्रण को बरकरार रखता है और रिलीज़ करता है।

एक बार जब आप CLANG_WARN_OBJC_RECEIVER_WEAK को सुनना चाहते हैं तो शून्य जांच के लिए है, जब शून्य त्रुटि उत्पन्न कर सकता है।

Parent *strongRefToParent = self.weakRefToParent; 
if (strongRefToParent) { 
    NSString *name = [strongRefToParent name]; 
    [self.namesArray addObject:name]; 
} 
+2

बहुत बेहतर जवाब (में "सटीक और संकलक लेखक का निश्चित प्रतिक्रिया के आधार पर" के रूप में):

if (self.weakRefToParent) { //self.weakRefToParent could be dealloced and set to nil at this line NSString *name = [self.weakRefToParent name]; //CLANG_WARN_OBJC_RECEIVER_WEAK warning [self.namesArray addObject:name]; //name is nil, NSInvalidArgumentException } 

यह सुरक्षित तरीका है। धन्यवाद! – bbum

संबंधित मुद्दे