2010-12-20 12 views
7

नहीं कहा जा रहा है मेरे पास एक नेविगेशन आधारित दृश्य नियंत्रक है और दृश्य नियंत्रक में मैंने शीर्ष नेविगेशन बार छुपाया है और नेविगेशन बार के रूप में एक कस्टम UIView का उपयोग किया है।UIViewController और UIview dealloc को

UIView बार में बैक बटन है और बैक बटन प्रीपेड होने पर व्यू कंट्रोलर से संवाद करने के लिए मैं प्रतिनिधि विधियों का उपयोग करता हूं (मैंने प्रोटोकॉल घोषित किया है)।

मैं अपने कस्टमनेविगेशन बार आईडी प्रतिनिधि में प्रतिनिधि का उपयोग करता हूं;

और मुख्य दृश्य नियंत्रक में जब मैं नेविगेशन पट्टी मैं प्रतिनिधि

topBar = [[TopNavigationBar alloc] initWithFrame:CGRectMake(0, 0, 480, 40)]; 
topBar.lblTitle.text = @"Shop"; 
topBar.delegate = self; 

सेट मैं ViewControllers dealloc में इस बार जारी आवंटित।

अब जब मैं बैक बटन दबाता हूं तो मैं मुख्य व्यू कंट्रोलर में पॉपव्यू कंट्रोलर को कॉल करने के लिए प्रतिनिधि विधि का उपयोग करता हूं।

//in Custom Bar 
-(void)ButtonPressed { 
    [delegate TopNavigationBarBackButtonPressed]; 
} 

//In View COntroller 
-(void)TopNavigationBarBackButtonPressed { 

    [self.navigationController popViewControllerAnimated:YES]; 
} 

अब ViewController poped है और नियंत्रण पिछले ViewController को जाता है लेकिन dealloc दोनों ViewController और UIView

में निकाल दिया नहीं है क्या मैं गलत कर रहा हूँ?

+0

किसी भी विचार लोगों होना चाहिए ?? यदि retainCount 0 नहीं है तो एक डीलोक को नहीं बुलाया जाएगा, लेकिन मैं कहीं भी कंट्रोलर को बनाए नहीं रख रहा हूं। मैं इसे स्टैक पर धक्का देने के बाद एक [vewController रिलीज] करता हूं। इसलिए एकमात्र कारण मैं सोच सकता हूं कि मैंने लिखा कस्टम प्रोटोकॉल है। क्या मुझे इसे छोड़ना है? मैं संपत्ति में प्रतिनिधि को बरकरार रखता हूं। लेकिन अगर मैं इसे डेलोक में छोड़ देता हूं, तो इसे बुलाया नहीं जा रहा है। स्टम्प्ड !!! –

उत्तर

16

ठीक है! अंत में समझ में आया कि समस्या क्या थी।

हां यह प्रतिनिधि था। तो मेरे "बैक बटन दबाए गए" विधि में, मुझे प्रतिनिधि को शून्य में सेट करने की आवश्यकता है।

-(void)TopNavigationBarBackButtonPressed { 

topBar.delegate = nil; 
[self.navigationController popViewControllerAnimated:YES]; 
} 

और वॉयला, सभी डेलोक को बुलाया जाता है। अरे आप कस्टम प्रोटोकॉल। मेरे जीवन के 2 दिन मैं कभी वापस नहीं आऊंगा।

संपादित करें: प्रतिनिधि को शून्य पर सेट करने की आवश्यकता नहीं है।

मुझे सभी समस्याएं थीं क्योंकि संपत्ति में मैं प्रतिनिधि को बनाए रख रहा था।

@property(nonatomic, retain)id <ASNavigationDelegate>delegate; 

यह

@property(assign)id <ASNavigationDelegate> delegate; 
+1

मेरे पास विचारों का एक समूह था जो इस वजह से रिलीज़ नहीं हो रहा था, मैंने कोड के एक बुरे टुकड़े को कई बार कॉपी किया - इसके लिए धन्यवाद! – Slee

+0

ओवरराइडिंग ओवरराइडिंग/रिलीज और कॉल स्टैक को देखकर इन स्थितियों के लिए सहायक भी हो सकता है। – markshiz