2012-04-26 13 views
9

मैं के साथ काम कर एक कक्षा संदर्भ वर्गों में से एक के रूप में परिभाषित किया है:आईफोन आईओएस क्लास ऑब्जेक्ट को किसी अन्य क्लास ऑब्जेक्ट से कैसे तुलना करें?

Class _objectClass; 

    if([self.objectClass isSubclassOfClass:[NSManagedObject class]]) 
     { 
      //does not get called 
     } 

मैं कैसे जांच कर सकते हैं Class किस तरह मैं के साथ काम कर रहा हूँ?

अद्यतन: क्षमा करें स्वत: पूर्ण मुझे यह नहीं दिखाया गया है किकिंडऑफ क्लास: उपलब्ध था। मैं परीक्षण कर रहा हूँ कि अब

+2

आप '-isKindOfClass की तलाश में हो सकता है:' विधि: https://developer.apple।कॉम/लाइब्रेरी/मैक/# प्रलेखन/कोको/संदर्भ/फाउंडेशन/प्रोटोकॉल/एनएसओब्जेक्ट_Protocol/संदर्भ/NSObject.html –

+0

नीचे दिए गए मेरे उत्तर में स्पष्टता के लिए ... objectClass क्या है? क्या वह वास्तविक वर्ग का नाम है? एक वर्ग का एक उदाहरण? कृपया नहीं कि अर्थशास्त्र का सुझाव है कि कक्षाओं को पहले पूंजी पत्र के साथ नामित किया जाए, और लोअरकेस के साथ उदाहरण। तो, MyClass एक वर्ग है, और instanceOfMyClass MyClass का एक उदाहरण है। – jmstone617

+0

कक्षा _objectClass किसी प्रकार का क्लास ऑब्जेक्ट संदर्भ है जो RestKit इसका ऑब्जेक्ट इंस्टेंस इंस्टेंट करने के लिए उपयोग कर रहा है। –

उत्तर

27

दो तरीकों में आपकी रुचि है के होते हैं:

isKindOfClass: रिसीवर पूछता है कि यह एक वर्ग या एक उपवर्ग, जहां isMemberOfClass: के रूप में रिसीवर पूछता है अगर यह वर्ग है , लेकिन उप-वर्ग नहीं है। उदाहरण के लिए, मान लीजिए कि आपके पास ऑब्जेक्ट क्लास नामक NSManagedObject सबक्लास है।

if([self.objectClass isKindOfClass:[NSManagedObject class]]) { 
    // This will return YES 
} 
else if ([self.objectClass isMemberOfClass:[NSManagedObject class]]) { 
    // This will return NO 
} 

पहले बयान देता है हाँ (या सच है, या 1) क्योंकि क्लास NSManagedObject का एक उपवर्ग है। दूसरा कथन NO (या झूठी, या 0) देता है क्योंकि यह उप-वर्ग है, यह कक्षा ही नहीं है।

अद्यतन:

if ([self.class isKindOfClass:self.class]) 

झूठी वापसी होगी: मैं नीचे एक टिप्पणी, जिसमें कहा गया है इस व्याख्या गलत है क्योंकि निम्न कोड पंक्ति को प्रकाश में लाने के लिए इस उत्तर को अपडेट करना चाहते । यह सही है, यह झूठी वापसी होगी। लेकिन यह उदाहरण गलत है। एनएसओब्जेक्ट से प्राप्त हर वर्ग भी NSObject प्रोटोकॉल के अनुरूप है। इस प्रोटोकॉल के भीतर class नामक एक विधि है जो "रिसीवर के वर्ग के लिए क्लास ऑब्जेक्ट देता है"। इस मामले में, self.class जो भी वर्ग वस्तु स्वयं देता है देता है। हालांकि, isKindOfClass: पर दस्तावेज़ीकरण से -

एक बूलियन मान कि यह दर्शाता है कि रिसीवर किसी वर्ग का एक उदाहरण या किसी भी वर्ग कि उस वर्ग से विरासत का एक उदाहरण है दिखाता है।

इस प्रकार, इस संदेश को self.class (जो एक वर्ग है) भेजने के झूठे रिटर्न क्योंकि यह एक वर्ग का एक उदाहरणके लिए भेजा जाना, एक वर्ग के लिए ही नहीं होती है।

आप

if([self isKindOfClass:self.class]) 

के उदाहरण को बदलते हैं आप हाँ मिल जाएगा (या सच है, या 1)।

मेरा जवाब यहाँ मानती है कि self.objectClass एक उदाहरण क्लास नामित करने के लिए एक्सेसर है। निश्चित रूप से, यह एक वर्ग के उदाहरण के लिए एक भयानक नाम है, लेकिन सवाल यह नहीं था कि "मैं कक्षाओं के उदाहरण कैसे नाम दूं"।

+0

उपरोक्त दोनों को जोड़कर वह प्राप्त नहीं होगा। आपको isKindOfClass की आवश्यकता होगी: [NSManagedObject क्लास] &&MemberOfClass: [ऑब्जेक्ट क्लास क्लास], मानते हुए self.objectClass ऑब्जेक्ट क्लास नामक कक्षा का एक उदाहरण है। – jmstone617

+1

निश्चित रूप से। एक बिल्ली त्वचा के लिए एक से अधिक तरीके। या उस मामले के लिए प्रोग्राम एक :) :) – jmstone617

+0

आपकी व्याख्या गलत है। उदाहरण के लिए, '[self.class isKindOfClass: self.class] '' NO' लौटाएगा, जो आप जो समझा रहे हैं उसके विपरीत है। 'IsKindOfClass' का उपयोग उदाहरण के वर्ग की जांच करने के लिए किया जाता है, कक्षा नहीं। – tia

1

हां, [self.objectClass isSubclassOfClass:[NSManagedObject class]] सही है। यदि यह गलत है, तो इसका मतलब है कि self.objectClass द्वारा प्रतिनिधित्व किया गया वर्ग NSManagedObject का उप-वर्ग नहीं है। मुझे समझ में नहीं आता कि आपकी समस्या क्या है, या आप क्या उम्मीद कर रहे हैं।

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