एक दिलचस्प छोटी समस्या में भाग लें। जांच करने के लिए एक इकाई परीक्षणNSArray को NSSet में कनवर्ट करना, कस्टम क्लास इंस्टेंस ट्रांसफर असंगत रूप से
- (NSArray*)distinctObjectsByAddress {
NSSet* uniqueSet = [NSSet setWithArray:self];
NSArray* retArray = [uniqueSet allObjects];
return retArray;
}
और लिखा है:: मैं एक अनोखी विधि वस्तुओं के लिए एक सरणी फिल्टर करने के लिए लिख रहा था
- (void)testDistinctObjectsByAddress5 {
Person* adam1 = [[Person alloc] initWithFirstName:@"adam" lastName:@"adam" andParent:nil];
Person* adam2 = [[Person alloc] initWithFirstName:@"adam" lastName:@"adam" andParent:nil];
testPersonArray = [NSArray arrayWithObjects:adam1,adam2, nil];
NSArray* checkArray = [testPersonArray distinctObjectsByAddress];
STAssertEquals([checkArray count], [testPersonArray count], @"Array %@ counts should match %@ %@",checkArray,adam1,adam2);
}
सुंदर सरल। दिलचस्प हिस्सा यह है कि परीक्षण पास होने के लगभग 80-90% और हर बार यह विफल रहता है क्योंकि distinctObjectsByAddress
विधि केवल एक वस्तु लौटाती है। मैं इसे [NSSet setWithArray:self]
कॉल पर ढूंढने में सक्षम हूं लेकिन मैं यह भी सत्यापित करने में सक्षम हूं कि दो व्यक्ति वस्तुएं दो अलग-अलग वस्तुएं हैं (कम से कम उनके पास अलग पता है)। मुझे लगता है कि setWithArray:
सिर्फ मूल पता तुलना कर रहा है लेकिन मुझे समझ में नहीं आता है कि कभी-कभी यह दो वस्तुओं का उत्पादन क्यों करता है जैसे कि इसे कभी-कभी केवल एक ही बनाना चाहिए।
कुछ मैंने अभी कोशिश की है adam2
बदल रहा था ताकि पहला और अंतिम नाम बिल्कुल adam1
जैसा ही न हो। यह त्रुटि को ठीक करने लगता है। क्या यह कुछ प्रकार के कंपाइलर ऑप्टिमाइज़ेशन को इंगित करता है जब ऑब्जेक्ट्स तार्किक रूप से समान होते हैं?
मुझे लगता है कि समस्या व्यक्ति के साथ है और यह कैसे हैश और समानता विधियों को लागू करता है जो एनएसएसएटी उपयोग करता है। –
यह 'isEqual:' का उपयोग करेगा जैसा कि वस्तुओं की तुलना करने के लिए 'NSObject' प्रोटोकॉल द्वारा परिभाषित किया गया है; क्या आपने इसे 'व्यक्ति' पर लागू किया है या 'हैश'? – Tommy
हैश समस्या के अतिरिक्त, आप स्पष्ट रूप से nam के लिए adam1 और adam2 का परीक्षण नहीं कर रहे हैं। यदि कोई कभी-कभी इनिट करने में असफल रहता है, तो वह परीक्षण विफलता की व्याख्या करेगा। – bneely