2011-11-02 15 views
5

से पहले प्रतिनिधि मौजूद है या नहीं, मैं आईओएस ऐप लिखता हूं और आलसी लोड छवियों में छविस्टोर लाइब्रेरी का उपयोग करता हूं और उन्हें स्मृति में कैश करता हूं। (Https://github.com/psychs/imagestore)आईओएस जांचें कि कॉल विधि

ViewController पर मैं imagestore उदाहरण बनाने के लिए:

imageStore = [ImageStore new]; 
imageStore.delegate = self; 

छवि सफलतापूर्वक लोड किया, imagestore कॉल प्रतिनिधि विधि

- (void)imageStoreDidGetNewImage:(ImageStore*)sender url:(NSString*)url 

कि reloadData कर कोशिकाओं को फिर से निकालने के लिए टेबलव्यू पर। सभी अच्छे काम करते हैं। लेकिन समस्या है: यदि ViewController ने अपलोड किया था (नेविगेशन नियंत्रक में वापस जाएं) और छवि लोड हो गई है, तो क्रैश के साथ एप्लिकेशन खत्म हो गया है, क्योंकि अनलोड किए गए ViewController की इमेस्टेस्ट कॉल विधि।

मैं निम्नलिखित करने की कोशिश: 1) ViewController में मैं viewDidUnload अनुभाग में इस कोड को जगह:

imageStore.delegate = nil; 
imageStore = nil; 

2) imageStore में मैं शून्य के लिए जाँच जोड़ा गया:

if(delegate != nil) { 
    ...call delegate method 
} 

यह काम करता है, लेकिन समय-समय पर ऐप दुर्घटनाग्रस्त हो जाता है।

+0

'2) 'अनावश्यक है। संदेश सुरक्षित रूप से 'nil' ऑब्जेक्ट पर भेजा जा सकता है। – Nekto

+0

उत्तर के लिए धन्यवाद! लेकिन अगर छवि लोड हो और दृश्य नियंत्रक अनलोड हो तो इसके बिना 100% क्रैश हो ... –

उत्तर

12

इस कोड को डेलोक अनुभाग पर डालने का प्रयास करें।

imageStore.delegate = nil; 
imageStore = nil; 

उसी तरह यदि खंड आवश्यक है क्योंकि एक शून्य वस्तु के लिए किसी भी कॉल आवेदन के द्वारा नजरअंदाज कर दिया है, इसलिए यदि आप कुछ इस तरह की जरूरत नहीं है:

id delegate = nil;  
[delegate callAnyMethod]; 

में कोई प्रभाव नहीं है अपने आवेदन व्यवहार, दूसरे हाथ में है, तो विधि प्रतिनिधि की कॉल वैकल्पिक आप asure चाहिए कि प्रतिनिधि चयनकर्ता का जवाब है, कुछ इस तरह चाल करना चाहिए:

if([delegate conformsToProtocol:@protocol(yourProtocolName)] && [delegate respondsToSelector:@selector(imageStoreDidGetNewImage:url:)]) { 
     [delegate imageStoreDidGetNewImage:imageStore url:url]; 
} 

चीयर्स!

0

यह काम करता है, लेकिन समय-समय पर ऐप दुर्घटनाग्रस्त हो जाता है।

यह एक विरोधाभास है। दो संभावनाएं हैं:

  1. आपका फ़िक्स काम करता है, और ऐप किसी अन्य कारण से क्रैश हो रहा है।

  2. आपका फ़िक्स काम नहीं करता है, ऐप उसी कारण से दुर्घटनाग्रस्त हो रहा है क्योंकि यह पहले क्रैश हो रहा था।

यह जानना मुश्किल है कि इन दोनों में से कौन सी संभावनाएं वास्तव में हो रही हैं। त्रुटि संदेश और क्रैश से सबूत देखें, जैसे स्टैक क्रॉल। ऐप क्रैश क्यों हो रहा है? क्या यह delegate संपत्ति को पहले बिना जांच किए कहीं भी हटाना है? क्या यह कुछ करने वाले प्रतिनिधि पर निर्भर करता है, ताकि यदि प्रतिनिधि अब मौजूद न हो तो वह काम नहीं किया जाता है और इससे बदले में दुर्घटना हो जाती है? ये वे चीजें हैं जिन्हें मैं देखना चाहता हूं, लेकिन फिर सबसे महत्वपूर्ण बात यह है कि आपके पास सबूत हैं और अपनी नाक का पालन करें।

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