Objective-C-Runtime Bug When Naming a Superclass "Message" -


मेरे पास निम्न श्रेणी hierachy है:

  @interface संदेश: NSObject {} @end @ कार्यान्वयन संदेश - (शून्य) dealloc {// मुझे [सुपर डेलोक] नहीं कहा जाएगा; } @end @ इंटेटरफ़ूमेसेज: संदेश {} @end @implementation FooMessage - (शून्य) dealloc {// को कॉल करना चाहिए - डेलोक [सुपर डेलोक]; } @end  

और निम्नलिखित इकाई परीक्षण:

  - (शून्य) परीक्षण {FooMessage * msg = [[एफयूएमएएसएजी एलोक] init]; [Msg रिलीज]; }  

परीक्षा हमेशा EXC_BAD_INSTRUCTION के साथ असफल हो जायेगी। FooMessage कॉल को dealloc में सुपर वर्ग डिस्ट्रक्टर कहते हैं, लेकिन कॉल कभी नहीं आती है। इसके बजाय, उद्देश्य-सी रनटाइम एक अलग स्थान पर कॉल को हल करता है: स्टैकट्रेस और disassembly

त्रुटि तब नहीं होती है यदि संदेश आधार वर्ग को कुछ और नाम दिया गया है, उदा। AbstractMessage । ऐसा प्रतीत होता है कि संदेश नाम का दूसरा वर्ग है, इसकी परिभाषा सार्वजनिक रूप से उपलब्ध नहीं है।

क्या यह एक बग है? क्या वास्तव में यहाँ हो रहा है? क्या मैं किसी भी नामकरण प्रतिबंधों का उल्लंघन कर रहा हूँ (भले ही मुझे लगता है कि संकलक मुझे उस बारे में चेतावनी चाहिए) ?.

यह XCode 3.1 है। आईफोन ओएस 3.0 के लिए संकलन

ओज़्स्ट्रव सी में नामस्थानों की अवधारणा नहीं है। उपसर्ग-नाम स्थान (जैसे NS ऑब्जेक्ट या एमके मानचित्रदृश्य) का उपयोग करके समस्या अच्छी तरह से ज्ञात है और आम तौर पर काम करती है आप अपना संदेश वर्ग JrMessage नामित (अज्ञात) वर्ग के साथ संदेश नाम से संघर्ष से बचने के लिए कर सकते हैं।

संकलक केवल आपको चेतावनी दे सकता है अगर यह जानता था दूसरे वर्ग के बारे में निजी, अप्रमाणित वर्गों के मामले में, यह अक्सर मामला नहीं है। इसे संभालने का सबसे अच्छा तरीका हर वर्ग पर उपसर्ग का उपयोग करके संघर्ष से बचने के लिए है। यह भविष्य की झड़पों के खिलाफ भी मदद करता है, जब ऐप्पल ने ओएस के एक नए रिलीज को कक्षाएं जोड़ते हैं (जो कि संकलक स्पष्ट रूप से चेतावनी नहीं दे सकता था)।

संपादित करें:

आगे की जांच से पता चलता है कि कम से कम iPhone सिम्युलेटर पर "MIME.framework" नामक एक निजी फ्रेमवर्क से प्रतिस्पर्धी वर्ग के मूल:

  NSLog (@ "संदेश वर्ग:% @", [[एनएसबींडल बंडल फोर क्लास: एनएससीलासफ्रेम स्ट्रिंग (@ "मेसेज")] बंडलपाथ]); ... संदेश वर्ग: / डेवलपर / प्लेफ़ोम्स / आईफोन सिमुलेटर.प्लाइट / डेवलपर / एसडीके / आईफोन सिमुलेटर 03.1.3.sdk/System/Library/PrivateFrameworks/MIME.framework  

आप जोड़ना चाहें आपकी जानकारी।


Comments