ऑब्जेक्टिव-सी में किस क्लास का ऑब्जेक्ट टेस्ट करता है?


207

मैं कैसे परीक्षण करूं कि क्या ऑब्जेक्ट ऑब्जेक्टिव-सी में एक विशेष वर्ग का उदाहरण है? मान लीजिए कि मैं देखना चाहता हूं कि क्या वस्तु वर्ग b, या वर्ग c का उदाहरण है, मैं इसे कैसे करूं?

जवाबों:


345

यह जांचने के लिए कि क्या ऑब्जेक्ट कक्षा का एक उदाहरण है:

[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of 
// given class or an instance of any class that inherits from that class.

या

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.

ऑब्जेक्ट का क्लास नाम पाने के लिए आप NSStringFromClassफ़ंक्शन का उपयोग कर सकते हैं :

NSString *className = NSStringFromClass([yourObject class]);

या सी-फ़ंक्शन ऑब्जेक्टिव-सी रनटाइम एपीआई से:

#import <objc/runtime.h>

/* ... */

const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);

EDIT: स्विफ्ट में

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}

69
#_port के लिए मत भूलना <objc / runtime.h> class_getName () के लिए
Ovesh


3
मेरी समझ यह है कि यह केवल उन वस्तुओं के लिए काम करता है जो NSObject को विरासत में मिला है।
हेनरिक पी। हेसल

1
@afEkenholm - लेकिन iOS 4.x पर नहीं, बस हम जानते हैं।
जेजे रोहर

2
class_getNameओवर का उपयोग करने का क्या फायदा है NSStringFromClass? यदि कोई नहीं है, तो इस उत्तर को समायोजित किया जाना चाहिए।
डैन रोसेनस्टार्क

21

आप भी उपयोग कर सकते हैं

NSString *className = [[myObject class] description]; 

किसी भी NSObject पर


8
प्रोग्रामर ने विवरण पद्धति को ओवरराइड किया है या नहीं, इसके आधार पर यह काम कर सकता है या नहीं। [ऑब्जेक्ट क्लास] या NSStringFromClass का उपयोग करना हमेशा क्लास का नाम देता है, हालाँकि।
Futureelite7

1
डिबगिंग के लिए अच्छा है और यह जानना कि आपका रहस्य किस प्रकार का है!
एम जेसी

3

Apple दस्तावेज़ीकरण में isKindOfClass के बारे में क्या मतलब है

क्लास क्लस्टर द्वारा दर्शाई गई वस्तुओं पर इस पद्धति का उपयोग करते समय सावधान रहें। क्‍लास क्‍लस्‍टर के स्‍वभाव के कारण, आपको जो वस्तु वापस मिलती है वह हमेशा आपके द्वारा अपेक्षित प्रकार नहीं हो सकती है। यदि आप किसी विधि को क्लास क्लस्टर लौटाते हैं, तो विधि द्वारा दिया गया सटीक प्रकार उस ऑब्जेक्ट के साथ क्या कर सकता है, इसका सबसे अच्छा संकेतक है। उदाहरण के लिए, यदि कोई विधि NSArray ऑब्जेक्ट के लिए एक पॉइंटर लौटाती है, तो आपको यह देखने के लिए इस पद्धति का उपयोग नहीं करना चाहिए कि क्या सरणी म्यूट है, जैसा कि निम्नलिखित कोड में दिखाया गया है:

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

यदि आप अपने कोड में ऐसे निर्माणों का उपयोग करते हैं, तो आप सोच सकते हैं कि किसी वस्तु को संशोधित करना ठीक है कि वास्तव में संशोधित नहीं किया जाना चाहिए। ऐसा करने पर अन्य कोड के लिए समस्याएँ उत्पन्न हो सकती हैं, जिससे ऑब्जेक्ट के अपरिवर्तित रहने की उम्मीद होती है।


आपका उदाहरण कोड सही नहीं है। यदि आप NSArray के लिए परीक्षण करते हैं, तो आप केवल समस्याओं में भागेंगे, जो वैसे भी अपरिवर्तनीय है। यदि आप एक विशिष्ट वर्ग के लिए परीक्षण करना चाहते हैं, तो आपको इसके बजाय isMemberOfClass का उपयोग करना चाहिए।
Futureelite7

@ futureelite7 यह एक उदाहरण है कि क्लास के प्रकार के लिए परीक्षण कैसे नहीं किया जाता है। एप्पल प्रलेखन कहा गया है कि -isKindOfClass:और -isMemberOfClass:एक वर्ग के क्लस्टर के भीतर वस्तुओं की पहचान करने के लिए नहीं किया जाना चाहिए।
pxpgraphics

3

यदि आप एक विशिष्ट वर्ग के लिए जाँच करना चाहते हैं तो उपयोग कर सकते हैं

if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}

1

अगर आप क्लास का नाम पाना चाहते हैं, तो कॉल करें: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);

0

आप रन टाइम भी चेक कर सकते हैं। कोड और अंदर (lldb) कंसोल लिखने में एक ब्रेकपॉइंट लगाएं

(lldb) po [yourObject class]

ऐशे ही..

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.