क्या कोई यह समझा सकता है कि किंडऑफ क्लास उदाहरण के निर्माण के आधार पर अलग-अलग परिणाम क्यों देता है?isKindOfClass व्यवहार
@interface BaseClass
...
@interface DerivedClassA : BaseClass
...
DerivedClassA *instance = [[DerivedClassA alloc] init];
[instance isKindOfClass:[BaseClass class]]; // yields YES
Class c = NSClassFromString(@"DerivedClassA");
id instance = [[c alloc] init];
[instance isKindOfClass:[BaseClass class]]; // yields NO
डीबगर में दो प्रकार से मैं जो कुछ भी प्राप्त कर सकता हूं वह समान है। मैं NSStringFromClass ([उदाहरण superclass]) के दोनों परिणामों की तुलना भी कर सकता हूं और वे बराबर हैं।
मुझे कुछ आसान याद आना चाहिए।
अपडेट किया गया कोड
इस इकाई परीक्षण कोड है।
LightingUnit *u1 = [[LightingUnit alloc] init];
STAssertTrue([u1 isKindOfClass:[ModelBase class]], @"should be derived from base");
Class uc = NSClassFromString(@"LightingUnit");
id u2 = [[uc alloc] init];
STAssertTrue([u2 isKindOfClass:[ModelBase class]], @"should be derived from base");
यहां कक्षा परिभाषाएं हैं।
@interface ModelBase : NSObject
@property (readonly) NSString *__type;
- (id)initWithDictionary:(NSDictionary *)dictionary;
- (NSMutableDictionary *)dictionary;
@end
@interface LightingUnit : ModelBase
@property (strong, nonatomic) NSString *name;
@property NSInteger unitId;
@end
संभावित जवाब
जब मैं इस मुद्दे के बिना परीक्षण वातावरण के अपने काम करता है बाहर इस तर्क को चलाते हैं। जाहिर है, केवल अंतर ही STAssertTrue कथन को हटा रहा है और उन्हें मेरी स्थितियों से बदल रहा है। इस मामले में वे दोनों हाँ वापस आते हैं। मैंने एक सरलीकृत उदाहरण (आधार या व्युत्पन्न में कोई भी इवर्स) बनाने की कोशिश की और यह परीक्षण में विफल रहता है लेकिन मानक रनटाइम में काम करता है।
कोई विचार क्यों परीक्षण करते समय यह केवल एक मुद्दा हो सकता है? क्या मेरा परीक्षण लक्ष्य कुछ खो रहा है?
हल
मैं परीक्षण लक्ष्य सूत्रों संकलन में मीटर फ़ाइलें शामिल था। एक बार हटा दिए जाने के बाद यह अपेक्षित व्यवहार करना शुरू कर दिया। इसे हल करने में मेरी सहायता के लिए this post पर धन्यवाद।
बस कोशिश की, दो हाँ प्राप्त करें। 'instance' –
की श्रेणी मुद्रित करने का प्रयास करें क्या यह 'बेस क्लास: NSObject' होना चाहिए? उस प्रश्न का उत्तर आपके प्रश्न का उत्तर बदल देगा। – Ephemera
आपको अपना असली कोड पेस्ट करने की आवश्यकता है। आपका नमूना कोड ठीक काम करता है, जब तक मैं 'बेस क्लास' को 'NSObject' का उप-वर्ग बना देता हूं (यह अन्यथा संकलित भी नहीं करता है)। –