2009-11-17 24 views
83

bir EXC_BAD_ACCESS neden olur, böyleceNasıl bir NSInteger bir int dönüştürebilirsiniz? Örneğin

[a value] gibi NSInteger örneğine value mesajı geçerken.

NSInteger, int nasıl dönüştürülür?

Sadece ilgili < 32 numaralı telefon numaralarıyla ilgilidir.

+2

Şaşkın görünüyorsunuz. [değer], bir nesnenin olmasını beklediğinizi, ancak şu anda bir NSInteger olmasını önerir. Bir int için "dönüştürme", bu sorunu çözmeyecektir. –

cevap

179

Ta da:

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

NSInteger bir 32/64 bit int başka bir şey değildir. (Hangi işletim sisteminizi çalıştırdığınıza göre uygun boyut kullanacaktır)

+11

Tam olarak, ben NSInteger 32-bit platformlarda bir int ve 64-bit platformlarda uzun olduğunu düşünüyorum. –

+4

Önerilen "döküm" kullanarak bir uyarı alıyorum: Kesikli dönüşüm tamsayı kesinlik kaybeder: 'NSUInteger' (aka 'unsigned long') 'int' – djcj

+0

@djcj, evet, yanıt yeni SDK'lar için doğru değil. Bence. – NAZIK

17

NSInteger'u int'a dönüştürmeniz gereken durumlar hakkında emin değilim.

NSInteger sadece bir typedef: bağımsız bir 32-bit veya 64-bit sistem için inşa ediyoruz olmadığının bir tamsayı tanımlamak için kullanılır

NSInteger .

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

Sen dönüştürmeden bir int kullanmak NSInteger herhangi bir yerde kullanabilirsiniz. Bu satır içi yapmak istiyorsanız

+2

Burada bir NSUinteger öğesini int: value karşılaştırmasına dönüştürmek için iyi bir neden var. (int i = -1)> (NSUinteger j = 14) int'yi imzasız olarak dönüştürür, yani -1> 14, istediğiniz gibi değil. –

+1

@SamuelClay. Belirli durumlarda kullanıldığında iyi bir nokta. Şahsen, NSUInteger'i bir uint'e dönüştürürdüm. Ancak. Soru NSUInteger'i değil NSInteger'i dönüştürmekle ilgiliydi. – Abizern

+0

Ben sadece ortak bir tuzağı göstermek için imzasız bir int kullanılır. Cevabımın gösterdiği gibi, her ikisi için de aynı türden bir cast.Bu zor bir problem değil, ama yeterince yaygın ve henüz hiç kimsenin tek satırlık bir yanıt önermediğini görmedim. –

28

, sadece bir int için NSUInteger veya NSInteger dökme: yerine 32bits ait 64bits, değil kolay yolu derlerken kullanılan

Yaygın UIsegmentedControl kullanılan
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

Sadece meraktan ötürü, iki basamaklı oylarla zaten kabul edilmiş bir cevabı olan bir soru üzerine 2 yıl sonra neden bir cevap gönderiyorsunuz? Özellikle de sizinki bu cevabın bir ifadesidir. –

+6

Yanıtım tek bir satır olduğu için (inline type cast - (int)), OP'nin ne isteyebileceğini düşünüyorum. Kendime baktım ve konuyla ilgili bütün cevapların çok satırlı olduğunu fark ettim. –

+2

Kabul edilen yanıt, tek bir satır kullanarak örtülü bir dönüşüm olduğunu gösterir. Abizern'in cevabı, “int” yerine “NSInteger” değerini kullanmaya çalışırsanız, örtük bir dönüşümün gerçekleşeceğini açıklar. Her iki durumda da çok satırlı bir çözümdür. –

0

, "hata" görünür yeni bir değişkene geçmek, bu ipuçlarını kullanın eklemektir (int):

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

yerine:

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]]; 
İlgili konular