2009-02-17 13 views
5

उद्देश्य-सी में, आप किसी ऑब्जेक्ट के गतिशील प्रकार को रनटाइम पर अपने isa सदस्य चर को असाइन करके बदल सकते हैं:क्या यह उद्देश्य-सी ऑब्जेक्ट के आईएसए को बदलने के लिए व्यवहार को परिभाषित करता है?

id object = ...; 
object->isa = [SomeClass class]; 

क्या यह अपरिभाषित व्यवहार है? मैं वर्तमान में इसे किसी और चीज के लिए एक कड़वाहट के रूप में कर रहा हूं, और ऐसा लगता है कि यह काम कर रहा है, लेकिन मुझे इस तरह से बहुत गंदे लग रहा है। मैं जिस नई कक्षा में सेटिंग कर रहा हूं वह किसी सदस्य चर को जोड़ता नहीं है, यह सिर्फ एक विधि को ओवरराइड करता है और एक नया जोड़ता है, इसलिए कक्षा का आकार समान होता है। मुझे लगता है कि अगर मैंने ऑब्जेक्ट आकार बदल दिया है, तो बहुत बुरापन का परिणाम होगा।

+0

[उद्देश्य-सी: रनटाइम पर किसी ऑब्जेक्ट की श्रेणी को कैसे बदला जाए?) (Http://stackoverflow.com/questions/8512793/objective-c-how-to-change-the-class- ऑफ-ऑब्जेक्ट-ऑन-रनटाइम) –

+0

आप केवीओ के साथ समस्याओं में भाग ले सकते हैं। वे भी आईएसए-स्विजलिंग का उपयोग करते हैं। माइक ऐश का पूरा समाधान है हालांकि: http://www.mikeash.com/pyblog/friday-qa-2010-11-19- क्रिएटिंग- क्लास-at-runtime-for-fun-and-profit.html – nielsbot

उत्तर

1

मुझे लगता है कि यह है, जैसा कि आप कहते हैं, गंदे।

  • नव सौंपा वर्ग वास्तविक वर्ग का एक उपवर्ग है:

    मैं अगर यह काम करेंगे संदेह है।

  • नई कक्षा कोई सदस्य चर नहीं जोड़ती है।

लेकिन मैं स्वीकार करूंगा कि मुझे आपके उद्देश्य-सी रनटाइम सिस्टम के पागल-और-बोल्ट कार्यान्वयन को नहीं पता है। मुझे पता है कि एक कार्यान्वयन के लिए मुझे क्या समझ में आता है।

0

इन्हें बदलने के लिए यह वास्तव में खराब रूप है, और यह रनटाइम व्यवहार के बारे में सभी प्रकार की मान्यताओं को बनाता है - आप runtime functions का उपयोग करके बहुत बेहतर हैं हालांकि वे आपको कक्षा को सीधे बदलने के लिए एक तंत्र प्रदान नहीं करते हैं।

+0

मुझे पता है हालांकि यह केवीओ काम करता है – nielsbot

0

This answer जोशुआ वेनबर्ग द्वारा ऐसा करने का सही तरीका प्रदान करता है। यह मेरे लिए काम किया। :)

और डारॉन अपने शिक्षित अनुमान के साथ सही था :) यह केवल तभी काम करेगा जब यह वर्तमान वस्तु का सुपरक्लास है, और यदि आप कोई सदस्य नहीं जोड़ते हैं।

1

उद्देश्य-सी रनटाइम अब ऐसा करने के लिए एक फ़ंक्शन प्रदान करता है: object_setClass। दस्तावेज यह नहीं कहता कि वहां कौन से प्रतिबंध हैं, लेकिन (जैसा कि अन्य ने कहा है) मुझे लगता है कि आप नई कक्षा को कक्षा में बिल्कुल मूल वर्ग के रूप में आवृत्ति परिवर्तनीय लेआउट के साथ प्रतिबंधित करना चाहते हैं।

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