2011-04-14 19 views
62

एक UIViewController डिफ़ॉल्ट केंद्र के लिए खुद को जोड़ता है:पोस्ट के कारण "EXC_BAD_ACCESS" अपवाद

[[NSNotificationCenter defaultCenter] 
postNotificationName:@"editFood" 
object:self]; 

रन टाइम के दौरान यह एक मिलती है:

[[NSNotificationCenter defaultCenter] 
addObserver:self 
selector:@selector(editFood) 
name:@"editFood" 
object:nil]; 

फिर एक UITableView प्रतिनिधि NSObject एक NSNotification पोस्ट EXC_BAD_ACCESS अपवाद।

defaultCenter कहीं जारी किया जा रहा है? एक ही अवधारणा काम करती है जब मैं UIViewController से UIViewController को अधिसूचना पोस्ट करता हूं, लेकिन इससे कोई फर्क नहीं पड़ता, है ना?

+0

यह वास्तव में दुर्घटनाग्रस्त कहां है? – Till

+3

'[[NSNotificationCenter defaultCenter] को हटाकर ओब्सर्वर: स्वयं] 'से' - (शून्य) dealloc {} 'आपकी दृश्य में विधि शायद आपके लिए इस समस्या को हल करेगी। यह मेरे लिए काम किया; मुझे वही समस्या थी जो आप थे। सौभाग्य! – nodebase

उत्तर

128

आपके ग्राहकों में से एक को हटा दिया गया है। अपने डेलोक में [[NSNotificationCenter defaultCenter] removeObserver:self] पर कॉल करना सुनिश्चित करें (यदि जल्द नहीं है)।

+1

सबसे अधिक संभावना सही - सामान्य गलती। +1 – Till

+3

धन्यवाद, मुझे बस मेरी गलती का एहसास हुआ (इसे देखने और चार घंटे के लिए शोध करने के बाद)। जिस कॉल को मैं कॉल के बाद संदर्भित करने का प्रयास कर रहा था उसे जारी कर दिया गया था। डीबगर ने इसे ऐसा ही देखा जहां EXC_BAD_ACCESS अपवाद फेंक दिया गया था। –

+4

@ पॉल: लाश उपकरण इस तरह की समस्या को डीबग करने में वास्तव में सहायक है। – Sven

9

EXC_BAD_ACCESS dealloc सत्यापन करने के बाद भी हो सकता है इसलिए की तरह मौजूद है:

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self] 
} 

ऊपर समस्या समय की सबसे समाधान होगा, लेकिन जाहिरा तौर पर मेरे कारण है कि मैं परोक्ष रूप से एक selector: सेट करने के लिए के साथ पर्यवेक्षक जोड़ने किया गया था nil इस प्रकार है:

[NSNotificationCenter.defaultCenter addObserver:self 
             selector:nil 
              name:notificationName 
              object:nil]; 

... इसलिए जब मुझे लगता है कि notificationName साथ कुछ पोस्ट, EXC_BAD_ACCESS हुई।

समाधान एक चयनकर्ता को भेजना था जो वास्तव में कुछ को इंगित करता था।

+1

यूप है, बस इसे स्वयं पाया है, मैंने चयनकर्ता के रूप में 'NULL' को अस्थायी होने का इरादा रख दिया है, जैसे ओह मुझे उस विधि को बनाने दें, तो मैं अद्यतन करने के लिए भूल गया बाद में चयनकर्ता परम (डीओएच) और हाँ, EXC_BAD_ACCESS परिणाम। –

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