2012-04-09 8 views
7

पर विचार करें:संपत्ति कॉपी और Block_copy (myBlock)/[myBlock प्रतिलिपि]

typedef void (^select_block_t)(UIView *) ; 

(1) @property (copy, nonatomic) select_block_t  myBlockProperty ; 
(2) @property (strong, nonatomic) select_block_t  myBlockProperty ; 
(3) @property (assign, nonatomic) select_block_t  myBlockProperty ; 

और:

(A) self.myBlockProperty = ^(UIView *) {NSLog(@"Hi");} ; 
(B) self.myBlockProperty = [^(UIView *) {NSLog(@"Hi");} copy] ; 

मैं समझने के लिए जो संपत्ति घोषणा मैप करने के लिए सही तरीका है कोशिश कर रहा हूँ, जिसके साथ ब्लॉक प्रति अर्थ विज्ञान

मैं उदाहरण S.O. पर here देखा है कि एहसान होगा [1: बी]

012,

लेकिन फिर मैं उलझन में हूं कि 'कॉपी' ऑपरेशन कितना अनावश्यक है। मेरी सीमित समझ यह है कि [1: ए] सही होना चाहिए, क्योंकि मुझे ब्लॉक को एक बार कॉपी करने की आवश्यकता है जब मैं संपत्ति को असाइन करता हूं, एक बार ब्लॉक निर्माण पर नहीं और फिर एक बार संपत्ति असाइनमेंट समय पर।

[3: बी] मेरे तर्क के अनुसार भी समझ में आएगा। तो, मैं गलतफहमी क्या कर रहा हूं?

उत्तर

9

[1: ए] सही है, हाँ। [3: बी] गलत है क्योंकि:

  1. यह स्पष्ट नहीं है कि वर्ग संपत्ति के स्वामी हैं, तो dealloc में इसे जारी करना चाहिए (लेकिन यह चाहिए)
  2. सेटर (बी) एक रिसाव की तरह लग रहा है, और स्थैतिक विश्लेषक इसे इस तरह ध्वजांकित कर सकता है, क्योंकि ब्लॉक की प्रतिलिपि बनाई गई है, एक संपत्ति को सौंप दिया गया है, फिर गिनती +1 के साथ दायरा छोड़ देता है।
  3. (3) का मतलब है कि यह केवल तभी काम करता है जब आप एक हीप-ब्लॉक (एक प्रतिलिपि ब्लॉक) सेट करते हैं, जिसमें एक की एक गिनती होती है। संपत्ति का उपयोग करते समय यह त्रुटि के लिए बहुत मार्जिन छोड़ देता है। (1) स्टैक-ब्लॉक और हीप-ब्लॉक दोनों के साथ काम करता है, और ऑटो-रिलीज ब्लॉक को सही ढंग से बनाए रखेगा।

संपादित करें: मुझे लगता है कि आप एआरसी का उपयोग कर रहे हैं। उस स्थिति में, [3: बी] का उपयोग करना संभव नहीं है। संकलक एक वस्तु को छोड़ देगा (भले ही copy एड) एक बार यह दायरे से बाहर हो जाए, और इस प्रॉपर्टी सेटर को इसे बनाए रखा नहीं होगा। इसलिए संपत्ति में एक खराब सूचक होगा, यह एक EXC_BAD_ACCESS होने का इंतजार कर रहा है।

+0

रुको, बस अपना टैग _automatic-ref-counting_ देखा, क्या आप एआरसी का उपयोग कर रहे हैं? – joerick

+0

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

+0

@verec मैंने अपना जवाब अपडेट कर दिया है। अगर आपको कोई प्रश्न है तो मुझे बताएं, मुझे यकीन नहीं है कि मैं कितना स्पष्ट हूं! – joerick

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