Objektive c implizite Konvertierung verliert ganzzahlige Genauigkeit 'NSUInteger'
Folgenden ein tutorial Baumhaus, ich bin sehen dieses beliebte Objekt-C Warnung in XCode.
My button-Funktion
- (IBAction)buttonPressed:(UIButton *)sender {
NSUInteger index = arc4random_uniform(predictionArray.count);
self.predictionLabel.text = [predictionArray objectAtIndex:index];
}
Sehe ich es auf der NSUInteger Linie habe ich einige wenige der ähnlichen stackoverflows und Sie scheinen zu sprechen, 32bit vs 64bit zahlen und type-casting, aber nicht sicher sind, wie Sie das hier tun?
Meine predictionArray
- (void)viewDidLoad
{
[super viewDidLoad];
predictionArray = [[NSArray alloc] initWithObjects:
@"It is certain", @"It is decidely so", @"All signs say YES", @"The stars are not aligned",
@"My reply is no",
@"It is doubtful",
@"Better not tell you now",
@"Concentrate and ask again",
@"Unable to answer now", nil];
//Do any additional setup after loading the view, typically from a nib.
}
InformationsquelleAutor der Frage Leon Gaban | 2013-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie sicher unterdrücken Sie die Warnmeldung mit einem cast.
Es ist nicht immer sicher zum unterdrücken von Warnungen, so gehen Sie nicht Gießen, die Dinge loszuwerden, die Warnungen, bis Sie herausfinden, ob der Betrieb sicher ist.
Was hier Los ist, dass
NSUInteger
ist, auf Ihrer Plattform, ein typedef für ein 64-bit-integer-Typ. Es ist nicht immer 64 bit, nur auf einigen Plattformen. Der compiler warnt Sie, dass einige dieser bits werden immer weggeworfen. Wenn Sie wissen, dass diese bits sind unwichtig, Sie können nur mit einem cast.In diesem Fall, das Ergebnis ist, dass
index
immer unter 232-1. Wenn es überhaupt möglich fürpredictionArray
zu enthalten, 232 oder mehr Elementen, dann ist dein Programm hat einen Fehler und Sie müssen konstruieren Sie eine 64-bit-version vonarc4random_uniform()
. Können Sie sicherstellen, dass diese mit dem folgenden code:InformationsquelleAutor der Antwort Dietrich Epp
Als pro meinen Kommentar
arc4random_uniform()
nimmt, und gibt einu_int32_t
eine vorzeichenlose Ganzzahl, die ist immer 32 bit, unabhängig von der Ziel-Architektur. AllerdingspredictionArray.count
gibt einNSUInteger
dietypedef
d-unterschiedlich für 32-bit und 64-bit-Systeme; es sind 32 bits (unsigned int
) auf einem 32-bit-system und 64-bit (unsigned long
) auf einem 64-bit-system. Wenn Sie auf einem 64-bit-system, übergeben in einer 64-bit -NSUInteger
zu einer Funktion erwartet einen 32-bit-Ganzzahl, die bewirkt, dass den compiler sich beschweren, dass Sie wegwerfen bits.InformationsquelleAutor der Antwort Itai Ferber