2017-10-10 14 views
0

i utiliser Xcode 9NSMutableArray replaceObjectAtIndex crash

NSMutableArray *Upcase_Keys = @[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"]; 
NSString *str = [Upcase_Keys objectAtIndex:0]; 
str = @"test"; 
[Upcase_Keys replaceObjectAtIndex:0 withObject:str]; 

obtient des données spécifiques pour NSMutableArray

Il transforme la valeur et l'index existant écrase.

Toutefois, ce code provoque un blocage.

Qu'est-ce que j'ai fait de mal?

Répondre

0

Vous avez défini comme objet immuable. La syntaxe affectera une référence NSArray non NSMutableArray. Vous ne pouvez pas mettre à jour NSArray.

Essayez comme ça,

NSMutableArray *Upcase_Keys = [NSMutableArray arrayWithArray:@[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"]]; 
+0

Merci d'avoir signalé le problème. : D –

1

NSMutableArray replaceObjectAtIndex crash

Il devrait y avoir une erreur dans la console. La console vous aidera 99% des cas en cas d'accident, lisez-le! Cela devrait ressembler à -[NSArrayI replaceObjectAtIndex:withObject:] unrecognized selector sent to instance. C'est la partie importante de votre erreur. En d'autres termes, ce n'est pas un NSMutableArray qui indique que le problème concerne la création de Upcase_Keys.

Pourquoi alors? Parce que @[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"]; est une syntaxe courte main pour NSArray, pas NSMutableArray. Donc, même s'il est déclaré comme NSMutableArray, l'objet est en fait un NSArray. En fait, si vous écoutez XCode, il devrait vous donner cet avertissement:

types pointeur incompatibles initialisation 'NSMutableArray *' avec une expression de type 'NSArray *'

Ce qui concorde avec tout ce que dit avant. `Parfois, XCode peut se tromper, mais essayez de l'écouter.

Il y a quelques possibilités appellent:

NSMutableArray *Upcase_Keys = [NSMutableArray arrayWithArray:@[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"]]; 
NSMutableArray *Upcase_Keys = [[NSMutableArray alloc] initWithArray:@[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"]]; 
NSMutableArray *Upcase_Keys = [@[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"] mutableCopy]; 

Enfin, une recommandation utiliser camelcase: Évitez de nommer votre var avec une majuscule. Utilisez un minuscule pour la première lettre. Je dirais qu'après le _ est moins problématique, mais nous avons tendance à écrire à la place.

Upcase_Keys =>upcase_Keys =>upcaseKeys

+0

oh; merci xD –