2011-02-23 8 views
5

मैंने iAds और adMob से निपटने के लिए UIView उप वर्ग बनाया है। व्यू कंट्रोलर उप-वर्ग प्रतिनिधि है और सबकुछ ठीक काम करता है। कभी-कभी, विज्ञापन प्राप्त होने से पहले दृश्य नियंत्रक गायब हो जाता है। इसे हल करने के लिए मैंने अपने दृश्य नियंत्रक के dealloc कार्यान्वयन में delegatenil पर सेट किया है।जांचें कि जवाब देने से पहले प्रतिनिधि अभी भी मौजूद है, तो चयनकर्ता

मेरी समस्या यह है कि कभी-कभी respondsToSelector: विधि एक ही समय में चलती है क्योंकि व्यू कंट्रोलर को हटाया जा रहा है। यह एक दुर्घटना का कारण बनता है। क्या कोई जानता है कि मैं इसे कैसे व्यवस्थित कर सकता हूं?

विज्ञापन दृश्य तो मैं एक ही स्थान पर विज्ञापन कोड बनाने के लिए चाहते हैं के बारे में 10 अलग दृष्टिकोण नियंत्रकों पर है।

कई धन्यवाद

उत्तर

5

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

+2

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

2
if (delegate && [delegate respondsToSelector:@selector(...)]) 
+0

im पहले से ही यह कर लेकिन :( – user609906

+4

यह 'के बराबर है अगर ([प्रतिनिधि respondsToSelector: @selector (...)])', शून्य रिटर्न 0. जांच की जा रही है कि क्या 'प्रतिनिधि == nil' एक मान्य नहीं है के लिए एक संदेश भेजने के बाद से यह देखने के लिए कि क्या प्रतिनिधि को हटा दिया गया है। –

-1

आपके पास 10 व्यक्तिगत विज्ञापन विचार नहीं होने चाहिए, यह कई स्तरों पर गलत है। इसके बजाय आपके पास केवल एक होना चाहिए जिसे आप व्यक्तिगत विचारों के बीच ले जाएं या - स्मार्ट - बस शीर्ष पर रखें।

उदाहरण के लिए आप एक टैबबारकंट्रोलर.व्यू में एक दृश्य जोड़ सकते हैं और यदि आप टैब स्विच करते हैं तो यह उपस्थित रहेगा। उन विचारों के लिए जिन्हें आप नहीं चाहते हैं कि आप विज्ञापन केवल इसे छुपा सकें।

0

हां यह आईएडी और एडमोब के साथ एक समस्या है। मुझे भी इस तरह की समस्या थी। मैंने मुख्य विंडो पर ऐड व्यू जोड़कर समस्या हल कर ली है और ऐप प्रतिनिधि को प्रतिनिधि बना दिया है, इसलिए ऐप प्रतिनिधि कभी भी एप्लिकेशन को बंद नहीं कर लेगा।

5

आप दृश्य बरकरार नहीं कर सकते, तो उदाहरण है, जिसमें dealloc में साफ कर दिया जाता प्राप्त करने के लिए एक स्थिर विधि का उपयोग करें। अर्थात्: के बजाय:

if (delegate && [delegate respondsToSelector:@selector(...)]) 

यह करें:

if (s_myViewDelegate && [delegate respondsToSelector:@selector(...)]) 

वर्ग में:

- (id) init { 
    s_myViewDelegate = self; 
    ...etc... 
} 

- (void) dealloc { 
    s_myViewDelegate = nil; 
} 
2

हालांकि यह एक सवाल बहुत पहले, मैं वास्तव में एक सा और अंत में इसके साथ गड़बड़ है कुछ ऐसा पाया जो मदद कर सकता है।

समाप्त या असफल घटना के प्रतिनिधि के बजाय completion block सेट करें, और इससे मदद मिलेगी।

+0

पूर्णता ब्लॉक के भीतर '__weak' संदर्भों का उपयोग करना न भूलें या आप कुछ अजीब त्रुटियां प्राप्त कर सकते हैं।याद रखें, ब्लॉक ऑब्जेक्ट में कैप्चर किए गए किसी भी चर को डिफ़ॉल्ट रूप से बरकरार रखा जाता है! –

+0

चीयर्स! सहायक अनुस्मारक। मैं _weak का उपयोग करना भूल जाता हूं ... – BabyPanda

+0

कुछ नमूना कोड या गाइड प्रदान करने में सक्षम हैं? मेरे पास यह समान प्रतिनिधि मुद्दा है लेकिन मुझे नहीं पता कि पूर्णता ब्लॉक का उपयोग करके कैसे शुरुआत करें। धन्यवाद! – Hexark

-1

वास्तव में एक तेज़ और वास्तव में अच्छा समाधान नहीं है - @ try/@ catch block का उपयोग करने के लिए।

@try{  
    if (delegate && [delegate respondsToSelector:@selector(...)]) 
    [delegate callBackMethod]; 
} 
@catch (NSException *e){ 
    // if you get here then delegate is no longer valid regardless its reference is still valid 
} 
+3

आप गलत हैं। कोशिश-पकड़ ब्लॉक केवल प्रोग्रामर त्रुटियों के लिए उपयोग किए जाते हैं: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/ErrorHandling/ErrorHandling.html%23//apple_ref/doc/uid/TP40011210 -CH9-SW3 –

+0

मैं कहाँ गलत हूँ? मैंने कहा था कि "यह वास्तव में अच्छा समाधान नहीं है"। क्या आप यह कहने की कोशिश कर रहे हैं कि यह समाधान बेहतर है या क्या? कोई समाधान नहीं है? ठीक है, एक आदर्श दुनिया/जीवन/आदमी आदि खोजने का प्रयास करें। – Stan

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