2009-11-17 15 views
83

उदाहरण के लिए जब इतनाएक एनएसआईएनटेगर को एक int में कैसे परिवर्तित करें?

[a value] यह एक EXC_BAD_ACCESS का कारण बनता है की तरह एक NSInteger उदाहरण के लिए एक value संदेश गुजर।

तो NSInteger से int को कैसे परिवर्तित करें?

यदि यह प्रासंगिक है तो केवल छोटी संख्या < 32 का उपयोग किया जाता है।

+2

आप बल्कि उलझन में प्रतीत होते हैं। [एक मूल्य] सुझाव देता है कि आप एक वस्तु होने की उम्मीद करते हैं, लेकिन इस समय यह एक एनएसआईएनटेगर है। एक int में "कनवर्ट करना" उस समस्या को हल नहीं करेगा। –

उत्तर

179

टा दा:

NSInteger myInteger = 42; 
int myInt = (int) myInteger; 

NSInteger एक 32/64 बिट पूर्णांक से ज्यादा कुछ नहीं है।

+11

सटीक होने के लिए, मुझे लगता है कि एनएसआईएनटेगर 32-बिट प्लेटफ़ॉर्म पर एक int है, और 64-बिट प्लेटफॉर्म पर लंबा है। –

+4

मुझे सुझाए गए "कास्टिंग" का उपयोग करके चेतावनी मिलती है: लागू रूपांतरण पूर्णांक सटीकता खो देता है: 'एनएसयूइंटर' (उर्फ 'हस्ताक्षरित लंबा') 'int' – djcj

+0

@djcj, हाँ, उत्तर नए एसडीके के लिए सही नहीं है। मुझे लगता है। – NAZIK

17

मैं परिस्थितियों जहां एक int के लिए एक NSInteger बदलने की आवश्यकता के बारे में यकीन नहीं है (यह उचित आकार आप चला रहे हैं क्या ओएस/मंच के आधार पर उपयोग किया जाएगा)।

NSInteger सिर्फ एक typedef है:

NSInteger आप एक 32-बिट या 64-बिट सिस्टम के लिए निर्माण कर रहे हैं कि क्या की स्वतंत्र रूप से एक पूर्णांक वर्णन करने के लिए प्रयोग किया जाता है।

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
#else 
typedef int NSInteger; 
#endif 

आप आप एक int का उपयोग NSInteger किसी भी जगह का उपयोग कर सकते यह परिवर्तित किए बिना।

+2

NSUinteger को int: value comparisons में कनवर्ट करना चाहते हैं। (int i = -1)> (NSUinteger j = 14) int को बिना हस्ताक्षरित, अर्थ -1> 14 में परिवर्तित करता है, जो आप नहीं चाहते हैं। –

+1

@ सैमुएलक्ले। विशिष्ट मामलों में उपयोग किए जाने पर एक अच्छा बिंदु। व्यक्तिगत रूप से, मैं एक NSUInteger को एक यूंट में परिवर्तित कर दूंगा। तथापि। सवाल एनएसआईएनटेगर को परिवर्तित करने के बारे में था, एनएसयूइंटर नहीं। – Abizern

+0

मैंने केवल एक सामान्य गड़बड़ी को चित्रित करने के लिए एक हस्ताक्षरित int का उपयोग किया। यह दोनों के लिए एक ही प्रकार का कलाकार है, जैसा कि मेरा जवाब दर्शाता है।यह एक मुश्किल समस्या नहीं है, लेकिन यह काफी आम है और मैंने अभी तक किसी को भी एक पंक्ति के उत्तर की सिफारिश नहीं की है। –

28

आप इस इनलाइन करना चाहते हैं, सिर्फ एक int को NSUInteger या NSInteger डाली:

int i = -1; 
NSUInteger row = 100; 
i > row // true, since the signed int is implicitly converted to an unsigned int 
i > (int)row // false 
+1

जिज्ञासा से बाहर, आप एक प्रश्न पर तथ्य के 2 साल बाद क्यों जवाब दे रहे हैं कि पहले से ही दो अंकों में वोटों के साथ एक स्वीकार्य उत्तर है? खासकर जब से आपका जवाब सिर्फ उस जवाब का एक पुनरावृत्ति है। –

+6

क्योंकि मेरा जवाब एक पंक्ति है (एक इनलाइन प्रकार कास्ट - (int) का उपयोग करके), जो मुझे लगता है कि ओपी क्या चाहता है। मैंने इसे स्वयं देखा और देखा कि इस विषय पर सभी उत्तरों बहु-पंक्ति थे। –

+2

स्वीकार्य उत्तर एक पंक्ति का उपयोग करके एक अंतर्निहित रूपांतरण दर्शाता है। एबिजर्न का जवाब बताता है कि यदि आप 'int' के स्थान पर 'NSInteger' मान का उपयोग करने का प्रयास करते हैं तो एक निहित रूपांतरण होगा। किसी भी मामले में यह एक बहु-लाइन समाधान नहीं है। –

0

आमतौर UIsegmentedControl में इस्तेमाल किया, "त्रुटि" दिखाई देते हैं जब 32bits के बजाय 64bits, नहीं करने के लिए आसान तरीका में संकलन यह एक नया वेरिएबल को भेजना, इस युक्तियों का उपयोग जोड़ने के लिए है (int):

[_monChiffre setUnite:(int)[_valUnites selectedSegmentIndex]]; 

के बजाय:

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]]; 
संबंधित मुद्दे