8

मैं एआरसी उपयोग कर रहा हूँ और iOS6 पर मैं एक अजीब दुर्घटना मिल someties बुला: gdb दूरदराज के एक त्रुटि दिखाई: E08gdb दूरदराज के एक त्रुटि दिखाई: E08 जब पूरा होने के ब्लॉक (EXC_BAD_ACCESS)

स्टैकट्रेस विधि से पहले में एक लाइन पर है जो एक समापन ब्लॉक कहते हैं। मैं ब्लॉक और एआरसी बारे में बहुत कुछ पढ़ा है, लेकिन मैं अभी भी विश्वास है जब उन्हें folling संदर्भ में प्रयोग नहीं कर रहा हूँ:

(सरलीकृत तरीके और कुछ कोड बाहर छोड़ दिया)

- (void) method1: (void(^)(NSMutableArray *a)) completionBlock withFailedBlock:(void(^)(NSInteger errorCode,NSString *error)) failedBlock { 
    __weak Controller *weakSelf = self; 

    ... 

    if(condition) 
     completionBlock(weakSelf.a); 

    //still do method2, since we might get updated data 
    [weakself.service method2:^(NSMutableArray *a2) { 
     weakSelf.shouldRefresh = NO; 

     ... 
     completionBlock(a2); //<-- sometimes crashes here 
    } withFailedBlock:^(NSInteger errorCode, NSString *error) { 
     failedBlock(errorCode, error); 
    }]; 


} withFailedBlock:^(NSInteger errorCode, NSString *error) { 
    failedBlock(errorCode, error); 
}]; 

कोड बुला:

[[Controller sharedController] method1:^(NSMutableArray *a) { 
    //save result in model (singleton) 
    [Model sharedModel].a = a; 
    [weakSelf refreshUI]; 

} withFailedBlock:^(NSInteger errorCode,NSString *error) { 
    ;//show alert 

}]; 

जब मैं इसके चारों ओर ब्लॉक और मूल्यों का निरीक्षण करता हूं, तो वे ठीक लगते हैं। मेरे पास NSZombie भी है। मेरा पूरा होने से ब्लॉक को स्वचालित रूप से कॉपी किया जाना चाहिए क्योंकि इसे ब्लॉक के भीतर से संदर्भित किया गया है।

मुझे यहां क्या याद आ रही है? मैंने आईओएस 5 और 4.3 पर भी क्रैश देखा है, लेकिन जीडीबी रिमोट ने कभी भी त्रुटि नहीं दी: E08। उन मामलों में डीबगर से जानकारी भी सहायक नहीं थी। मैं PLWeakCompatibility का उपयोग कर रहा हूं ताकि मैं आईओएस 4.3

+0

क्रैश शायद ब्लॉक निष्पादित कोड में है, तो आप उस कोड को क्यों पोस्ट नहीं करते? – Ecarrion

+0

ने इस जानकारी को शामिल करने के लिए पोस्ट को संपादित किया – splinter

+0

मुझे ऑब्जेक्ट की प्रतिलिपि करते समय यह त्रुटि सी ++ प्रोजेक्ट पर मिली ... अगर यह कोई मदद है। – Ross

उत्तर

0

के तहत __weak का समर्थन कर सकूं क्या आपको अभी भी यह समस्या है?

इस मामले में आपको खुद को कमजोर क्यों चाहिए। ऐसा नहीं लगता कि आप इस स्थिति में स्वयं को पकड़ रहे हैं। जब आप इसे छोड़ देते हैं तो क्या कोड अभी भी दुर्घटनाग्रस्त हो जाता है?

बीटीडब्ल्यू, मुझे लगता है कि जब आपने अपने प्रश्न के लिए इसे सरल बनाने की कोशिश की तो आपका तरीका 1 कार्यान्वयन थोड़ा गन्दा हो गया।

- (void) method1: (void(^)(NSMutableArray *a)) completionBlock withFailedBlock:(void(^)(NSInteger errorCode,NSString *error)) failedBlock { 
    ... 
} withFailedBlock:^(NSInteger errorCode, NSString *error) { 
    ... 
}]; 

मान्य विधि कार्यान्वयन की तरह नहीं दिखता है। यह कुछ ऐसा नहीं होना चाहिए:

- (void) method1: (void(^)(NSMutableArray *a)) completionBlock withFailedBlock:(void(^)(NSInteger errorCode,NSString *error)) failedBlock { 
    ... 
} 
संबंधित मुद्दे