Pracuję nad niektórymi ćwiczeniami i otrzymuję ostrzeżenie:
Niejawna konwersja traci dokładność liczb całkowitych: „NSUInteger” (aka „unsigned long”) na „int”
#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;
}
źródło
W przeciwieństwie do odpowiedzi Martina, rzutowanie na int (lub ignorowanie ostrzeżenia) nie zawsze jest bezpieczne, nawet jeśli wiesz, że twoja tablica nie zawiera więcej niż 2 ^ 31-1 elementów. Nie podczas kompilacji dla wersji 64-bitowej.
Na przykład:
źródło
indexOfObject:
byłoby złym pomysłem. Moja odpowiedź dotyczyła określonego kodu w pytaniu icount
metoda nie może zwrócićNSNotFound
. Nie zalecałem generowania ostrzeżeń int lub ignorowania ostrzeżeń. Przepraszam, jeśli to nie było jasne. W rzeczywistości Twój przykładowy kod wygenerowałby ostrzeżenie o,if (i == NSNotFound)
gdyby został skompilowany dla wersji 64-bitowej, więc problem nie zostałby niezauważony.Zmień klucz w Projekcie> Ustawienia kompilacji „ typecheck wywołuje printf / scanf : NIE ”
Objaśnienie: [Jak to działa]
Sprawdź wywołania printf i scanf itp., Aby upewnić się, że dostarczone argumenty mają typy odpowiednie dla określonego ciągu formatu i że konwersje określone w ciągu formatu mają sens.
Mam nadzieję, że to zadziała
Inne ostrzeżenie
cel c niejawna konwersja traci dokładność liczb całkowitych „NSUInteger” (alias „unsigned long”) na „int
Zmień klucz „ niejawna konwersja na typ 32-bitowy> Debugowanie> Architektura * 64: Nie ”
[ Uwaga: może unieważnić inne ostrzeżenie o konwersji architektury 64-bitowej] .
źródło
Wykonanie rzutowania na „int” rozwiązuje problem w moim przypadku. Miałem ten sam problem. Więc:
źródło