2010-06-09 13 views
19

पर काम करने से इंकार कर देता है मेरे पास एक आईफोन ऐप है जो मुख्य रूप से 3.0 को लक्षित कर रहा है, लेकिन जब वे उपलब्ध होते हैं तो नए एपीआई का लाभ उठाता है। सब कुछ एप्पल के कभी कहा था, अगर प्रासंगिक एपीआई दुर्बलता से जुड़े हुए हैं, वह ठीक से काम करेंगे क्योंकि गतिशील लिंकर NULL को UIApplicationDidEnterBackgroundNotification का मूल्यांकन करेंगे के अनुसारआईफोन पर कमजोर लिंकिंग

if (UIApplicationDidEnterBackgroundNotification != NULL) { 
    [nc 
     addObserver: self 
     selector: @selector(irrelevantCallbackName:) 
     name:  UIApplicationDidEnterBackgroundNotification 
     object:  nil]; 
} 

अब,: कोड कुछ इस तरह चला जाता है। सिवाय इसके कि यह नहीं है। एप्लिकेशन संकलित करता है, लेकिन जैसे ही यह if (UIApplicationDidEnterBackgroundNotification != NULL) हिट करता है, यह EXC_BAD_ACCESS के साथ दुर्घटनाग्रस्त हो जाता है।

क्या यह केवल एक कंपाइलर ध्वज का मामला है जिसे मुझे सेट करने की आवश्यकता है? या क्या मैं इस बारे में गलत तरीके से जा रहा हूं?

+0

मुझे पता था * मुझे केवल यूआईपीप्लिकेशंसविल्लएन्टर फोरमोटोटेशन एसओ पर खोज कर जवाब मिलेगा ... डेवलपर्स को सशर्त रूप से उपलब्ध ग्लोबल्स से निपटने की आवश्यकता का सबसे आम कारण होना चाहिए। –

+0

@ पियर्रे लेबेउपिन: ऐसा लगता है कि ऐसा मामला है। –

उत्तर

38

आंड मैंने इसे समझ लिया। कि (, extern const int foobar उदाहरण के लिए) कार्यों नहीं हैं प्रतीकों के लिए, आप प्रतीक, नहीं प्रतीक के ही पते के खिलाफ तुलना करने के लिए है, तो:

if (&UIApplicationWillEnterForegroundNotification != NULL) 
    etc; 

कौन सा पीछे मुड़कर देखें तो स्पष्ट तरह का है, लेकिन मैं अभी भी गलती मेरे आस-पास का पूरा ब्रह्मांड कभी भी भेद का जिक्र नहीं करता है।

+2

यदि आप एलएलवीएम का उपयोग कर रहे हैं, तो आपको अपने कथन को ऑप्टोमाइज़ करने के लिए कुछ युक्तियां करनी होंगी। यह मेरे लिए काम करता है। बूल पृष्ठभूमि ओके = और यूआईएप्लिकेशनडिडइंटरबैकग्राउंड नोटिफिकेशन! = न्यूल; यदि (पृष्ठभूमि ओके) { [[NSNotificationCenter defaultCenter] addObserver: स्वयं चयनकर्ता: @ चयनकर्ता (applicationDidEnterBackground :) नाम: UIAplplicationDidEnterBackgroundNotification bject: nil]; } –

+0

वेनिला जीसीसी का उपयोग करना, लेकिन यदि एलएलवीएम इसे अलग-अलग देख रहा है, तो मुझे संदेह है कि यह ऐप्पल के हिस्से पर एक बग हो सकता है (क्योंकि ऐप्पल स्पष्ट रूप से कमजोर-जुड़े प्रतीकों के साथ इस तरह के रनटाइम चेक करने के लिए डेवलपर्स को बताता है।) आप शायद एक टेस्ट केस लिखें और एप्पल को http://bugreporter.apple.com पर सबमिट करें। :) –

5

बाहरी फ्रेमवर्क स्थिरता की जांच करते समय मुझे क्या करना है।

const CLLocationAccuracy * ptr = &kCLLocationAccuracyBestForNavigation; 
BOOL frameworkSupports = (ptr != NULL); 
if (frameworkSupports) { 
    return kCLLocationAccuracyBestForNavigation; 
} else { 
    return kCLLocationAccuracyBest; 
} 

यह पीआरटी चर के बिना काम नहीं करेगा।

+0

>> यह पीआरटी चर के बिना काम नहीं करेगा। एंड्रयू बिल्कुल सही है .. –

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