2009-08-16 8 views

उत्तर

50

मौजूदा उत्तर उपयोगी हैं; उन्हें जोड़ने:

हाँ, NSUIntegerNSInteger के रूप में धनात्मक पूर्णांक के बीच दो बार सीमा देता है, लेकिन मैं एक और महत्वपूर्ण कारण चुनने के लिए दो बस है के बीच मामलों जहां ऋणात्मक मानों बस भावना नहीं बनाते हैं के बीच भेद करने के लिए लगता है।

उदाहरण:NSArray के count विधि की वापसी मान एक NSUInteger, जो समझ में आता है, क्योंकि हम तत्वों का एक नकारात्मक संख्या के साथ एक सरणी नहीं हो सकता है। जब कोडर जानता है कि यह हस्ताक्षरित है, तो उसे संचालन करने की अधिक स्वतंत्रता है जो हस्ताक्षर किए गए मामले में अविश्वसनीय हो सकती है, जिसमें स्थानांतरण जैसे बिटकवे ऑपरेशंस शामिल हैं। This blog post हस्ताक्षरित बनाम हस्ताक्षरित के बारे में अधिक बात करता है।

मेरा अनुमान है के बारे में CGFloat बनाम NSFloat (जो मौजूद नहीं है): यह मामला है कि NeXTSTEP नाम कोड तत्वों के डिजाइनरों बस समय के बाहर भी कई नाव मान निर्दिष्ट की जरूरत नहीं थी हो सकता है अंतराल। इसलिए उन्होंने NSTimeInterval दिया, जो एक फ़्लोटिंग-पॉइंट प्रकार है, लेकिन यह स्पष्ट रूप से समय अंतराल के उपयोग के लिए है। और, स्पष्ट रूप से, यह उस प्रकार का होना बहुत अच्छा है क्योंकि आप जानते हैं कि यह हमेशा एक संरचना से निपटने के बिना सेकंड में होना है। जब आप ग्राफिक्स दुनिया में जाते हैं (जहां कोर ग्राफिक्स रहता है), अचानक आपके चारों तरफ तैरते हैं, हवा में घूमते हैं (हाहा)। इसलिए वहां CGFloat पेश करना समझ में आता है। यह अनुच्छेद सभी "शिक्षित अटकलें" है। क्योंकि इस तरह से यह आसान है पोर्टेबल कोड है कि मशीन वास्तुकला का पूरा फायदा ले जाता है लिखने के लिए:

इसके अलावा, बस तुम क्यों आदिम प्रकार की NSInteger आदि का उपयोग कर सकते बजाय के बारे में स्पष्ट किया जाना है। उदाहरण के लिए, CGFloat कुछ मशीनों पर 32 बिट्स और अन्य बिट्स पर 64 बिट्स का उपयोग करता है, जो कि उन आकारों के लिए उन मशीनों पर कितनी दक्षता अंतर है, इस पर निर्भर करता है। कुछ मामलों में, 64 बिट्स बनाम 64 बिट्स का उपयोग करने के लिए कोई वास्तविक गति नहीं है, इसलिए आप 64 बिट्स का भी उपयोग कर सकते हैं। यदि आपने CGFloat के रूप में चीजों को घोषित कर दिया है, तो आप अचानक उस अतिरिक्त परिशुद्धता को "मुक्त करने के लिए" प्राप्त करते हैं जब आप पुनः संकलित करते हैं।

और, जैसा कि iKenndac ने कहा है, NSNumber इन सब के लिए एक आवरण वर्ग है (और BOOL जैसे अन्य आदिम या अर्ध-आदिम प्रकार) जो आप अपने NSArray और NSDictionary रों में शामिल करने के लिए सक्षम बनाता है, उन्हें अधिक आसानी से संग्रहित करें, और अन्य चीजें करें जो NSObject एस कर सकते हैं।

+0

वास्तव में, वास्तव में निगलना बिंदु: एनएसटीमेइंटरवाल एक डबल, फ्लोट नहीं है। मुझे पता है कि डबल-परिशुद्धता फ्लोटिंग पॉइंट के लिए डबल छोटा है, लेकिन फिर भी। इसके अलावा, मैं समझता हूं कि 64-बिट पर डबल के रूप में संकलित CGFloat महान है, लेकिन एनएसआईएनटेगर? मैं ऐसी स्थिति के बारे में नहीं सोच सकता जहां यह उपयोगी होगा। कोड में कहें कि आप कुछ गणित कर रहे हैं जिन्हें 64 बिट्स की आवश्यकता है ... यदि आप 32 के लिए संकलित करते हैं तो आप एनएसआईएनटेगर का उपयोग नहीं कर सकते हैं। यदि आप 32 में फिट हैं, तो 64 का उपयोग क्यों करें? अजीब लगता है। – iKenndac

+1

आप सही हैं, एनएसटीइम इंटरवल एक डबल है। मुझे लगता है कि यह अभी भी "फ़्लोटिंग-पॉइंट टाइप" के रूप में गिना जाता है। बस डबल परिशुद्धता के साथ। मैं यह भी मानता हूं कि कई मामलों में एनएसआईएनटेगर 64 बिट बनकर बहुत सारे कोड में सुधार नहीं होगा। लेकिन यहां एक संभावना है: एक यादृच्छिक संख्या जनरेटर। इस मामले में, आप वास्तव में गति की परवाह करते हैं, इसलिए जब आप तेज़ी से 32 बिट्स का उपयोग करना चाहेंगे। लेकिन यदि 64 बिट्स भी काम करता है, तो अचानक आपको यादृच्छिक-खुशी (_much_ लंबी चक्र लंबाई, आदि) में बहुत अधिक (यदि कोई हो) गति लागत में भारी वृद्धि मिलती है। – Tyler

+0

हम एक बार वोट क्यों दे सकते हैं? प्रतिभाशाली! –

56

NSNumber एक वर्ग है, जो कि आदिम नहीं है, और इसका उपयोग तब किया जाता है जब आपको कच्ची संख्याओं को शब्दकोश, सरणी या अन्यथा इन्हें समाहित करने की आवश्यकता होती है। NSInteger, NSUInteger, CGFloat, आदि सरल प्रकार और अनुरूप हैं (आईफोन की तरह 32-बीटी सिस्टम पर) int, unsigned int और float पर।

एक सामान्य नियम के रूप में, यदि आपको कहीं नंबर स्टोर करने की आवश्यकता है, तो NSNumber का उपयोग करें। यदि आप गणना कर रहे हैं, लूप, आदि, NSInteger, NSUInteger या CGFloat का उपयोग करें।

आप लपेट कर सकते हैं एक NSInteger एक NSNumber में:

NSNumber *aNumber = [NSNumber numberWithInteger:21]; 

... और यह वापस पाने:

NSInteger anInteger = [aNumber integerValue]; 

आप यहाँ और अधिक जानकारी प्राप्त कर सकते हैं: http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html

+0

यदि संख्या कभी नकारात्मक नहीं होगी, तो क्या मुझे NSUInteger का उपयोग करना चाहिए? – mk12

+0

और मुझे दशमलव के साथ किसी संख्या के लिए उपयोग करना चाहिए? – mk12

+0

यह CGFloat क्यों है और NSFloat नहीं है? – mk12

5

NSInteger है सी में पारंपरिक int की तरह यह एक टाइपिफ़ है। NSUInteger, CGFloat, आदि जैसे अन्य लोग हैं जो सभी प्राचीन प्रकार के समानार्थी हैं।

NSNumber उपयोगी है जब आपको किसी NSArray या NSDictionary में कोई संख्या चिपकाने की आवश्यकता होती है। मानक अभ्यास इन संग्रहों का उपयोग करके स्वयं को रोलिंग करना है; दोष यह है कि वे केवल उद्देश्य-सी वस्तुओं को शामिल कर सकते हैं।

NSArray * myArray = [[NSArray alloc] init]; 
[myArray addObject:3]; // invalid, will not compile. 
[myArray [NSNumber numberWithInt:3]]; // ok 
:

NSNumber अनिवार्य रूप से एक int (या नाव, आदि) एक Obj सी वस्तु में है कि एक सरणी में जोड़ा जा सकता ('मुक्केबाजी' एक आदिम प्रकार के सी #/जावा की अवधारणा के समान) लपेटता

प्रदर्शन कारणों से, यदि आप कर सकते हैं, आदिम प्रकारों (जैसे int, float, int []) का उपयोग करें। हालांकि, कभी-कभी आप NSArray/NSNumber से नहीं बच सकते हैं, जैसे कि जब आप .plist फ़ाइल में प्रविष्टियां पढ़ रहे हैं या लिख ​​रहे हैं।

+1

एनएसआईएनटेगर, एनएसयूइंटर, और सीजीएफएलएट टाइपपीफ हैं जो 32 या 64 बिट के तहत सुरक्षित हैं। – Abizern

0

जैसा कि पहले दूसरों ने कहा था, NSNumberNSObject सबक्लास है। यह सी आदिम नहीं है (int, unsigned int, float, double, आदि जैसे) NSInteger, CGFloat, NSUInteger सी प्राइमेटिव्स पर typedefs सरल हैं।

NSNumber की आवश्यकताएं एपीआई के पैरामीटर के रूप में संख्याओं का उपयोग करने की आवश्यकता से उत्पन्न होती हैं जिन्हें ऑब्जेक्ट की आवश्यकता होती है। उदाहरण है, जब आप NSArray में, कोर-डेटा में, या NSDictionary में किसी नंबर को स्टोर करना चाहते हैं।

क्या ऐसे कुछ प्राइमेटिव हैं जिनके बारे में मुझे पता होना चाहिए? खैर, NSNumber एक आदिम प्रकार नहीं है, और यह सभी प्रकार की संख्याओं (फ्लोट्स, अभिन्न प्रकार, बूलियन आदि) के आसपास लपेटता है। आपको NSValue के बारे में भी सीखना चाहिए, जो NSNumber के लिए आधार है।

क्या फ्लोट्स के लिए कोई है? वहाँ नाव के लिए कोई "एन एस" typedef है, लेकिन NSNumber किसी भी नाव संख्या लपेट कर सकते हैं:

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926]; 

या आप CoreGraphics आदिम प्रकार CGFloat इस्तेमाल कर सकते हैं।

2

NSNumber आम तौर पर चर के भंडारण के लिए प्रयोग किया जाता है, NSUInteger अंकगणित

के लिए प्रयोग किया जाता है आप ऐसा करने से एक NSUInteger करने के लिए एक NSNumber बदल सकते हैं:

NSNumber *variable = @1; 
NSUInteger variableInt = [variable unsignedIntegerValue]; 

यह पहले लेकिन एक सामान्य नियम के रूप में कहा गया है अंगूठे के, वेरिएबल्स जिन्हें परिभाषित करने की आवश्यकता है * उद्देश्य सी कक्षाएं हैं, जबकि वेरिएबल्स जिन्हें * की आवश्यकता नहीं है * सी प्राइमेटिव हैं।

संबंधित मुद्दे