isKindOfClass और isMemberOfClass के बीच iOS अंतर


152

isKindOfClass:(Class)aClassऔर isMemberOfClass:(Class)aClassकार्यों के बीच अंतर क्या है ? मुझे पता है कि यह कुछ छोटा है जैसे, एक वैश्विक है जबकि दूसरा एक सटीक क्लास मैच है लेकिन मुझे किसी को निर्दिष्ट करने की आवश्यकता है जो कृपया है।

में स्विफ्ट isKind(of aClass: AnyClass)और isMember(of aClass: AnyClass)

जवाबों:


264

isKindOfClass:रिटर्न YESअगर रिसीवर एक उदाहरण है निर्दिष्ट वर्ग के या किसी भी वर्ग का एक उदाहरण है कि विरासत में मिली निर्दिष्ट वर्ग से।

isMemberOfClass:YESयदि रिटर्न , और केवल अगर, रिसीवर निर्दिष्ट वर्ग का एक उदाहरण है।

अधिकांश समय आप isKindOfClass:यह सुनिश्चित करने के लिए उपयोग करना चाहते हैं कि आपका कोड उपवर्गों के साथ भी काम करता है।

NSObject प्रोटोकॉल संदर्भ इन तरीकों के बारे में थोड़ा और अधिक बात करती है।


क्या आप कृपया मेरे नीचे का संदेह साफ़ कर सकते हैं? अगर ([lbl.textColor isMemberOfClass: [UIColor वर्ग]]) {// Not Memeber NSLog (@ "Not Memeber"); } और {NSLog (@ "मेमोरबर नहीं"); } अगर ([imgView.image isMemberOfClass: [UIImage class]]) {// मेमेबर NSLog (@ "मेमियर"); } और {NSLog (@ "मेमोरबर नहीं"); }
Nikkie

82
  • isKindOfClass:इंगित करता है कि क्या किसी वस्तु को किसी वर्ग से विरासत में मिला है
  • isMemberOfClass:इंगित करता है कि क्या वस्तु किसी दिए गए वर्ग का उदाहरण है

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO

@ दुर्गा, यदि यह आपके प्रश्न का उत्तर देती है, तो आपको इसे स्वीकार करना चाहिए। दर को स्वीकार करने के बारे में और अधिक पढ़ें: meta.stackexchange.com/questions/16721/…
poncha

1
यदि ऑब्जेक्ट किसी दिए गए वर्ग का एक उदाहरण है तो isKindOfClass भी YES लौटाएगा। दूसरे शब्दों में isMemberOfClass isKindOfClass का सबसेट है।
स्कूटर

48

मान लीजिए

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

फिर

[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;

मूल रूप से, -isMemberOfClass:यह सच है कि यदि उदाहरण निर्दिष्ट वर्ग का है, जबकि -isKindOfClass:यह सच है कि यदि उदाहरण निर्दिष्ट वर्ग का है या यदि उदाहरण का कोई पूर्वज निर्दिष्ट वर्ग का है।

-isMemberOfClass: शायद ही कभी इस्तेमाल किया जाता है।


1
लेकिन अगर आपके पास सबव्यू का एक सरणी है जिसमें UIViews और UISegmentedControl शामिल हैं और आपने उनके माध्यम से लूप किया है और क्लास पर एक सशर्त सेट किया है, तो आपको उन्हें उपयोग करने की आवश्यकता होगी। isKindOfClass UISegmentedControl को UIView के रूप में देखेगा।
प्रिउइगिओ

@Pruitlgoe जो बहुत सच है। आप यह सुनिश्चित कर सकते हैं कि किंडऑफक्लास का उपयोग करें: [यूइवीव्यू क्लास] यह सुनिश्चित करने के लिए कि आप जिन वस्तुओं के साथ काम कर रहे हैं, वे उइवेइ हैं, लेकिन आपको इस्माइरऑफक्लास का उपयोग करने की आवश्यकता होगी: [यूइवीवुइ क्लास] और / या इस्माइऑफक्लास: [यूआईएसईईएडक्वाटर क्लास] किसी भी सशर्त विवरण को इंगित करने के लिए। उनके तात्कालिक उदाहरण वर्ग के आधार पर विचार
NoodleOfDeath

9

isKindOfClass : एक बूलियन मान लौटाता है जो इंगित करता है कि रिसीवर किसी दिए गए वर्ग का उदाहरण है या उस वर्ग से प्राप्त किसी भी वर्ग का उदाहरण है।

isMemberOfClass : एक बूलियन मान लौटाता है जो इंगित करता है कि रिसीवर किसी दिए गए वर्ग का उदाहरण है या नहीं।


2

isKindOfClass-> YES को वापस करें जब ऑब्जेक्ट उस वर्ग का उदाहरण या उस वर्ग का उदाहरण है जो उससे विरासत में मिला है।

isMemberOfClass: जब वस्तु उस वर्ग का उदाहरण है, लेकिन हां नहीं तो वापस लौटें, लेकिन उस वर्ग का उदाहरण जो उससे विरासत में मिला है।

उदाहरण jtbandes उत्तर में काफी अच्छा है।


0

वर्ग समूहों के कारण, isMemberOfClass आपको एक ऐसा उत्तर दे सकता है जिसकी आप उम्मीद नहीं कर सकते हैं। कई मामलों में आपका सबसे अच्छा विकल्प होने की अधिक संभावना है - (BOOL) अनुरूपताप्रोटोकॉल चॉकलेट: (SEL) aSelector या - (BOOL) के अनुरूपताप्रोटोकॉल: (प्रोटोकॉल *) aProtocol। यानी, इनका परीक्षण करना बेहतर है यदि वे परीक्षण वर्ग / उपवर्ग की बजाय आपकी आवश्यकता का उत्तर दे सकते हैं।

NSObject वर्ग और प्रोटोकॉल के लिए सेब डॉक्टर देखें:

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/cl/NSObject

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intf/NSObject

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