2011-08-18 9 views
16

को बनाए रखना जहां तक ​​मैं समझता हूँ कि एक ब्लॉक एक वस्तु की तरह काम करता है, उस में आप की नकल जैसे भेज सकते हैं या यह करने के लिए संदेश जारी कर सकते हैं,:EXC_BAD_ACCESS प्रतिलिपि बनाते समय या ब्लॉक

[myBlock copy]; 

हालांकि जब भी मैं ऐसा करते हैं, या रिहाई एक ब्लॉक, मुझे EXC_BAD_ACCESS मिलता है।

अगर मैं ब्लॉक कार्यों का उपयोग, सब कुछ उम्मीद के रूप में, उदा .:

Block_copy(myBlock); 

मैं रिहा और नकल ब्लॉक समान थे के दोनों तरीकों से सोचा काम करता है?

यह कोई समस्या नहीं है, लेकिन यह थोड़ा परेशान है कि अगर मेरे पास एक संपत्ति (प्रतिलिपि) है जो ब्लॉक है, तो मुझे खुद को सेटर विधि लिखनी है।

उदाहरण के लिए: गुण के साथ:

//Header 
@property (nonatomic, copy) void (^cancelledBlock)(void); 

//Implementation 
@sythesize cancelledBlock; 

जब cancelledBlock

की स्थापना EXC_BAD_ACCESS की ओर जाता है, लेकिन अगर मैं करता हूँ:

//Header 
@property (nonatomic, copy) void (^cancelledBlock)(void); 

//Implementation 
@sythesize cancelledBlock; //saves me doing the getter as well 

- (void)setCancelledBlock:(void (^)(void))aCancelledBlock { 
    if (cancelledBlock == aCancelledBlock) { 
     return; 
    } 
    void (^oldValue)(void) = cancelledBlock; 
    cancelledBlock = Block_copy(aCancelledBlock); 
    Block_release(oldValue); 

} 

कोई EXC_BAD_ACCESS है और सब कुछ एकदम सही ढंग से चलाता है।

+0

आपको केवल वही रिलीज़ करना चाहिए जो आपने पहले बनाए रखा था या कॉपी किया था। – Richard

+0

मुझे पता है कि, जैसा कि मैंने अपने प्रश्न में कहा है कि '[myBlock copy]' करने की कोशिश कर रहा है EXC_BAD_ACCESS देता है, लेकिन 'Block_copy (myBlock)' –

+0

नहीं है क्या आप हमें एक पूर्ण उदाहरण दिखा सकते हैं? –

उत्तर

26

लंबे और उबाऊ दोपहर और शाम के बाद मैं अंततः answer here पर आया, हालांकि यह असंबंधित प्रतीत हो सकता है, वेबसाइटों की श्रृंखला जिसे मैंने ढूंढने के लिए देखा था, उस संबंध को बनाता है।

मूल रूप से मुझे लिंकर झंडे से -weak_library /usr/lib/libSystem.B.dylib को हटाना पड़ा और इसे -weak-lSystem से बदलना पड़ा।

+0

पर फ्लिप करता है, तो धन्यवाद, जोनाथन! 4 घंटे से अधिक समय बाद आपने मेरी समस्या हल की! –

+0

वाह। मैंने सिम्युलेटर में लॉन्च होने पर मेरे ऐप को क्रैश होने का कारण जानने के लिए सचमुच हफ्तों बिताए हैं। इस जवाब ने किया। आपको बहुत - बहुत धन्यवाद! –

+0

मुझे पता है कि इस समस्या को कितना परेशान करना है, मैं बस चाहता हूं कि मुझे पता चले कि यह समाधान क्यों काम करता है। –

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