Soru nesnel c örtük dönüştürme, tamsayı kesinlik 'NSUInteger' (aka 'imzasız uzun') 'int' uyarı olarak kaybeder


Bazı alıştırmalarla çalışıyorum ve şunu belirten bir uyarı aldım:

örtük dönüştürme, tamsayı kesinlik 'NSUInteger' ('imzasız uzun') 'int' olarak kaybeder

Ben tamamen noob ve herhangi bir yardım için teşekkür ederim .. teşekkürler.

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])

{
    @autoreleasepool {


        NSArray *myColors;

        int i;
        int count;

        myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];

        count = myColors.count; //  <<< issue warning here

        for (i = 0; i < count; i++)

        NSLog (@"Element %i = %@", i, [myColors objectAtIndex: i]);

    }


return 0;

}

Screenshot


170
2018-06-04 13:13


Menşei




Cevaplar:


count yöntem NSArray bir döndürür NSUIntegerve 64 bit OS X platformunda

  • NSUInteger olarak tanımlanır unsigned long, ve
  • unsigned long 64 bit işaretsiz bir tamsayıdır.
  • int 32 bitlik bir tam sayıdır.

Yani int daha "küçük" bir veri türüdür NSUIntegerbu nedenle derleyici uyarısı.

Ayrıca bakınız NSUInteger "Temel Veri Türleri Referansı" nda:

32 bit uygulamalar oluştururken, NSUInteger bir 32-bit imzasız   tamsayı. 64 bitlik bir uygulama NSUInteger'i 64 bit işaretsiz olarak ele alır.   tamsayı.

Bu derleyici uyarısını düzeltmek için, yerel bildirimde bulunabilirsiniz count değişken olarak

NSUInteger count;

veya (dizininizin 2^31-1 elementler!), özel bir cast ekleyin:

int count = (int)[myColors count];

433
2018-06-04 13:19



Sadece eklemek için - Xcode 5 projemde ani bir uyarı ve hata yükü aldığım için bu cevabı onaylamıştım. 64bit'ten bahsettiniz ki bu da bana yapı ayarlarıma bakmaya yönlendirdi. Xcode, hataları kestiren 64 bit moduna değiştirdi. Arvm7'ye geri dönerek hepsini düzeltdik. - Tander
@Tander 64bit vs armv7 derleme arasında bir performans farkı var mı? - Shaun Budhram
@ShaunBudhram Onun görünüşüne göre. Hiç bir fark görmedim. Sadece CPU'yu yoğun olarak kullanan uygulamalarda bir fark yaratacak - oyunlar örneğin 64 bitlik bir derleme faydası görecekti. - Tander
"1 Şubat 2015'ten itibaren App Store'a yüklenen yeni iOS uygulamaları 64 bit destek içermelidir... "- Apple Geliştirici Haberleri ve Güncellemeleri, 20 Ekim 2014 - Pang
@JayprakashDubey: İkili derlenmiş uygulamayı App Store'a gönderdiğiniz için Apple derleyici uyarılarınızı görmez. Bu nedenle, derleyici uyarıları nedeniyle uygulamanız reddedilemez. Elbette uygulamanızı doğru bir şekilde yapmak için bunları düzeltmeniz gerekir. - Martin R


Martin'in cevabının aksine, dizininin 2 ^ 31-1 öğesinden fazla olmadığını bilseniz bile int (veya uyarıyı göz ardı etmek) için döküm yapmak her zaman güvenli değildir. 64-bit için derleme değil.

Örneğin:

NSArray *array = @[@"a", @"b", @"c"];

int i = (int) [array indexOfObject:@"d"];
// indexOfObject returned NSNotFound, which is NSIntegerMax, which is LONG_MAX in 64 bit.
// We cast this to int and got -1.
// But -1 != NSNotFound. Trouble ahead!

if (i == NSNotFound) {
    // thought we'd get here, but we don't
    NSLog(@"it's not here");
}
else {
    // this is what actually happens
    NSLog(@"it's here: %d", i);

    // **** crash horribly ****
    NSLog(@"the object is %@", array[i]);
}

23
2017-07-30 23:16



Sonucunu yayınlamak haklısın indexOfObject: Kötü bir fikir olur. Cevabım, söz konusu özel kod için yapıldı ve count yöntem geri dönemez NSNotFound. Genel olarak uyarmak veya genel olarak uyarıları ihmal etmeyi önermedim. Üzgünüz, bu açık değilse. Aslında örnek kodunuzda bir uyarı üretecekti if (i == NSNotFound) 64-bit için derlenmişse, sorun farkedilmeden gider. - Martin R
@Adrian: Eğer sakıncası yoksa, askerin ne yapmasını önerirsiniz? - moonman239
@ moonman239 Genelde, eğer mümkün ise (@ MartinR'nin ilk öneri) doğru türden bir değişken kullanmalıyım. İşaret ettiği gibi, bu durumda döküm işlemi güvenlidir, ancak bunun benim için beklenmedik sonuçlara yol açabileceğinden (örneğimde olduğu gibi) almanın zayıf bir alışkanlık olduğunu düşünüyorum. Bu özel durum tarafından ısırılandığım için gönderdim (her ne kadar cevapsız kaldığım == derleyici uyarısı hakkında iyi bir nokta olsa da). - Adrian
Sanırım sayım indexOfObject'den çok daha sık kullanılır ve NSInteger ile bir "for-loop" şişirmek, "fakir" kodlama stiline sahip olmamak saçmalıktır. Sadece indexOfObject için izlemeniz ve orada NSIntegers kullandığınızdan emin olmalısınız, sadece bir şey sayar her şey int, özellikle bir yöntem odak içinde - NikkyD


Proje> Yapı Ayarında anahtarı değiştir "typecheck, printf / scanf çağırır : YOK HAYIR"

Açıklama:  [Nasıl çalışır]

Sağlanan argümanların belirtilen format dizisine uygun tiplere sahip olduğundan ve format dizisinde belirtilen dönüşümlerin anlamlı olduğundan emin olmak için printf ve scanf vb. Çağrıları kontrol edin.

Umarım işe yarar

Diğer uyarı 

nesnel c örtük dönüştürme, tamsayı kesinlik 'NSUInteger' (aka 'unsigned long'), 'int' kaybeder

Anahtarı değiştir "32Bit Türü için örtük dönüştürme Tür> Hata ayıklama> * 64 mimarisi: Hayır"

[Dikkat: 64 Bit mimari dönüşümün diğer uyarısını geçersiz kılabilir].


4
2018-01-21 09:48



32 bit kitaplığınızı 64 bit'e dönüştürmek istiyorsanız, bu umut verici bir seçenektir. - San


"İnt" 'ye açık dökümün yapılması, davamda sorunu çözüyor. Bende aynı sorun vardı. Yani:

int count = (int)[myColors count];

2
2017-09-12 11:42



ya da "örtülü" olarak adlandırılıyor mu? LOL :) Her iki durumda da işe yaradı. - Vladimir Despotovic