12

क्या उद्देश्य-सी में प्रतिबिंब का कोई माध्यम है जो आपको किसी ऑब्जेक्ट के सार्वजनिक गुणों का निरीक्षण करके और एनकोडविथकोडर के जेनेरिक कार्यान्वयन उत्पन्न करके सामान्य एनएससीओडी कार्यान्वयन लिखने की अनुमति देगा: और initWithCoder:।जेनेरिक एनएससीओडी कार्यान्वयन के लिए उद्देश्य-सी प्रतिबिंब

मैं जावा के लिए XStream जैसे कुछ की सोच रहा हूं जो प्रतिबिंब का उपयोग करके जावा ऑब्जेक्ट को क्रमबद्ध और deserialize करने के लिए एक सामान्य तरीका की अनुमति देता है। इससे भी बेहतर होगा कि गुणों को चिह्नित करने के कुछ साधन शायद उन चीज़ों के रूप में हों जिन्हें आप क्रमबद्ध करना चाहते हैं या जो क्षणिक हैं (जावा में क्षणिक कीवर्ड की तरह)।

मैं कोको के लिए Archives and Serializations Programming Guide पर प्रलेखन पढ़ रहा हूं। मैं समझता हूं कि आप अपनी वस्तुओं के क्रमिकरण पर कुछ नियंत्रण चाहते हैं, लेकिन यह आम तौर पर एक सममित प्रक्रिया है और इसे क्रमबद्ध करने के लिए क्रमबद्ध करने के लिए कोड किए गए संदर्भ को उलटना अजीब लगता है। मैं DRY का विश्वास करने वाला हूं (स्वयं को दोहराएं)।

उत्तर

12

न केवल यह संभव है, लेकिन मेरे पास एक दोस्त है जिसने ठीक से ऐसा करने के लिए एक स्टैब लिया है। (आप उसका blog about it here देख सकते हैं।) प्रतिबिंब Objective-C 2.0 Runtime Reference में प्रलेखित उद्देश्य-सी रनटाइम फ़ंक्शंस का उपयोग करके किया जाता है। जरा देखो तो।

नोट, हालांकि, यह केवल तभी काम करेगा यदि आप सभी आवृत्ति चर को सहेजने के सामान्य व्यवहार चाहते हैं। हो सकता है कि आप एनएसवीव को अपने पर्यवेक्षण को सहेजना न चाहें, हालांकि; ऐसे मामलों में, सामान्य मामला काम नहीं करेगा।

आप किसी भी आवृत्ति चर के लिए गुणों को घोषित करके और छुपाए जाने वाले किसी भी अन्य चर के लिए गुणों को घोषित करके चीजों से लेकर क्रमबद्ध करने के लिए चीजों से लेकर क्रमबद्ध करने के लिए चीजों को समझ सकते हैं, लेकिन यह गुणों के पूरे उद्देश्य को घुमा रहा है एक छोटे से लाभ के लिए। मैं इसकी सिफारिश नहीं करता।

6

(मैं बीजे होमर की टिप्पणी में ब्लॉग पोस्ट के लेखक हूं)। कोड का उपयोग करने के लिए कुछ चेतावनी हैं:

  1. लक्ष्य वर्ग को केवीसी-अनुरूप होना चाहिए। यदि आप अपने इवर के लिए उद्देश्य-सी 2.0 गुणों का उपयोग कर रहे हैं, तो आप सभी सेट हैं। अन्यथा, आपको यह सुनिश्चित करने की ज़रूरत है कि आपकी कक्षा को उचित रूप से मूल्य का जवाब देने के लिए सेट किया गया है: और सेट वैल्यू: forKey: विधियां।
  2. कोड रनरटाइम के अनियंत्रित "फीचर" का उपयोग करता है ताकि एनआईसीओडीएस को ivar कक्षाओं को दोबारा अनुरूप बनाया जा सके। संकलित होने पर, लगभग सभी टाइपिंग जानकारी (AFAIK) को कोड से बाहर कर दिया जाता है, फिर भी ivars को बचाने के लिए, वे को एनएससीओडी के अनुरूप भी होना चाहिए। मैंने पाया कि अगर इवर एक ऑब्जेक्ट है और मैं उस पर ivar_getTypeEncoding() को कॉल करता हूं, तो मुझे एक सी स्ट्रिंग वापस मिल जाएगी जो कुछ ऐसा दिखता है: {#IVAR_CLASS} (उदाहरण: {#NSString})। मैं जो करता हूं वह # और} के बीच की स्ट्रिंग प्राप्त करता है, एनएससीएलएएसफ़्रोस्ट्रिंग का उपयोग करके क्लास ऑब्जेक्ट बनाएं, और उस पर पुन: कार्य करें।
  3. यह कोड सभी ivars को बचाएगा। (बेशक) को अपने जोखिम पर
  4. उपयोग

मैं मुख्य रूप से अवधारणा का एक सबूत के रूप में यह लिखा था, और वहाँ कई उदाहरण है जब इस कोड को शानदार विफल हो जाएगा रहे हैं। उदाहरण के लिए, ऑब्जेक्ट ए में बी के लिए एक ivar होता है, और बी के लिए एवर होता है, फिर एक या दूसरे को क्रमबद्ध करने के लिए कोड का उपयोग करना (मुझे विश्वास है) एक अनंत लूप का कारण बनता है।

फिर भी, मुझे लगता है कि यह बहुत ही बढ़िया है कि उद्देश्य-सी आपको पहले स्थान की तरह सामान भी करने की अनुमति देता है।

0

बाहर चेक RMModelObject:

http://www.realmacforge.com/svn/trunk/RMModelObject/

हालांकि, ध्यान दें कि ObjC क्रम सामान 10.5 में काम करता है, और सिम्युलेटर में नहीं, बल्कि एक वास्तविक iPhone पर। मुश्किल से पता चला .. शायद ओएस 3.0 अंत में इसका समर्थन करता है, लेकिन मैंने जांच नहीं की है।

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