2011-03-24 16 views
5

के साथ एनएसएनंबर की तुलना करें मैंने आज दो बग का पीछा करते हुए कुछ समय बिताया, और दोनों ही एक ही समाधान का उपयोग करके फिक्सिंग समाप्त कर दिया।एनएसएनएनटेगर

अब मेरे पास समाधान है, मैं इसके पीछे कुछ स्पष्टता प्राप्त करने की उम्मीद कर रहा था।

मैं एक इंटीजर (एबीप्रॉपर्टी आईडी & ABMultiValueIdentifier) ​​के साथ कोर डेटा (इंटीजर 16/एनएसएनंबर) से एक विशेषता की तुलना कर रहा हूं।

बग इस तुलना में था, और विचित्र रूप से पर्याप्त, केवल ऐप को मारने के बाद ही दिखाया गया था (पृष्ठभूमि ट्रे से), इसे फिर से खोल दिया, और उसी प्रक्रिया के माध्यम से तुलना की जिसमें तुलना शामिल थी। वैसे भी ...

यह वही है एक बार पुनः प्रारंभ करने काम करना बंद कर रहा है:

if (myNumber.aProperty == [NSNUmber numberWithInt:anInteger]) { /* do stuff here */ }

और इन दो समाधान है, जो अब तक पूरी तरह से काम कर रहे हैं कर रहे हैं:

if ([myNumber.aProperty integerValue] == anInteger) {/* do stuff here */ }

if ([myNumber.aProperty isEqualToNumber:[NSNumber numberWithInt:anInteger]]) { /* do stuff here */ }

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

कोई विचार?

उत्तर

11

NSNumber एस की तुलना करने के लिए == का उपयोग न करें। अधिकांश समय आप दो अलग-अलग वस्तुओं की तुलना करेंगे, इसलिए तुलना सही नहीं होगी। यदि आप अपनी स्थिति देखते हैं, तो ध्यान दें कि आप विशेष रूप से ब्रांड नईNSNumber ऑब्जेक्ट पर अपनी संपत्ति की तुलना कर रहे हैं।

चूंकि NSInteger कुछ मूल्य प्रकारों के लिए कोको रैपर है, NSInteger की तुलना == के साथ ठीक काम करता है।

isEqualToNumber: का कार्यान्वयन शायद लपेटा मूल्य प्रकार लेता है और उन्हें भी तुलना करता है।

+1

यह समझ में आता है।हालांकि, एक चीज जो अजीब थी, और मेरी पोस्ट में संक्षेप में उल्लेख किया गया था, यह है कि तुलना वास्तव में काम कर रही थी जब मैं पहली बार अपना ऐप चलाऊंगा। मेरे ऐप को मारने के बाद ही, इसे फिर से खोल दिया गया, और तुलना के माध्यम से ऐप चलाया कि मैंने अप्रत्याशित परिणाम देखना शुरू कर दिया। मेरे ऐप के बारे में कुछ भी जानने या किसी भी कोड को देखने के बिना, क्या आपके पास कोई अनुमान होगा कि यह क्यों हो रहा था? – djibouti33

+0

@ djibouti33: कोई सुराग नहीं है ... (और यह कहकर मैं इसकी अप्रत्याशितता को भी इंगित कर रहा हूं :) – BoltClock

2

जैसा कि आपने कहा, दोनों समाधान काम कर रहे हैं ...

मैं, पहले एक पसंद करेंगे के रूप में यह अधिक पठनीय प्रकट होता है, IMHO ... यह भी अधिक performant हो सकता है के रूप में आप पूर्णांकों तुलना कर रहे हैं, एक एनएसएनंबर को एक int में परिवर्तित करने के बाद।

दूसरा एक में, आप एक वस्तु के लिए एक पूर्णांक कनवर्ट करते हैं, तो आप दो वस्तुओं की तुलना ... तो यह है कि एक दूसरी विधि कॉल, जो आप पहले मामले में नहीं है ... है

आशा इस मदद करता है ...:)

1

netWorkingButtonsIndexes सरणी जो वस्तुओं रखती है और LinkedInint डेटा प्रकार के साथ एक संख्या है।

[[netWorkingButtonsIndexes objectAtIndex:buttonIndex] isEqual:[NSNumber numberWithInteger:LinkedIn]] 

isEqual पद्धति का उपयोग करके हम किसी भी डेटा rtype के साथ वस्तुओं की तुलना कर सकते हैं।