NSMutableDictionary: méthode de mutation envoyée à un objet immuable
Le code suivant retourne une exception avec le message d'erreur suivant "la mutation de la méthode envoyé immuable objet" lors de la tentative de removeObjectForKey
NSMutableDictionary * storedIpDictionary = (NSMutableDictionary*)[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"dictDeviceIp"];
NSString *key = self.currentDeviceNameText.text;
NSString *ipAddressTemp = [storedIpDictionary objectForKey:key];
[storedIpDictionary removeObjectForKey:key]; <----Crashes here
storedIpDictionary[key] = ipAddressTemp;
Pas sûr de ce que la question est, peut-être que c'est dû à la récupération du dictionnaire à partir d'un NSUserDefaults.
Toutefois, le code suivant fonctionne sans aucun problème.
NSMutableDictionary * storedIpDictionary = (NSMutableDictionary*)[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"dictDeviceIp"];
[storedIpDictionary removeAllObjects];
source d'informationauteur Remixed123 | 2014-08-04
Vous devez vous connecter pour publier un commentaire.
NSUserDefaults retourne des objets immuables, même si vous mettez en mutable. Vous devez appeler -mutableCopy sur la valeur retournée pour obtenir une mutable collection.
Vous ne pouvez pas simplement jeter un
NSDictionary
àNSMutableDictinary
c'est pas du tout combien de casting fonctionne.pour supprimer une clé de
NSUserDefualts
appelremoveObjectForKey
sur leNSUserDefaults
instance elle-même.si vraiment vous voulez un dictionnaire pour une autre raison, alors vous devez faire un
mutableCopy
du dictionnaire obtenus pardictionaryForKey
.C'est le code qui a finalement travaillé, j'ai utilisé certaines des informations fournies à partir d'autres ci-dessus, mais aucun ne l'a complètement expliqué.
si vous avez sur erreur NSMutableDictionary: la mutation de la méthode envoyé immuable objet dans Swift, faire de cette étape:
C'est parce que vous avez attribué un NSUserDefault à NSMutableArray, lorsque vous prenez quelque chose NSUserDefault il vous renvoie un NSArray pas un NSMutableArray, dans ce cas, vous devez utiliser un NSMutableArray Auxiliaire .
voir pour Swift :
Ce travail pour moi!!!
j'ai trouvé le même problème et a trouvé une solution j'espère que ça aidera certains.
NSUserDefaults retourne des objets immuables, même si vous mettez en mutable. Vous devez appeler -mutableCopy sur la valeur retournée pour obtenir une mutable collection. ainsi, lorsque vous obtenez la valeur de NSUserDefault utilisation mutableCopy()
[NSUserDefaults dictionaryForKey]
retourne immuable dictionnaire (NSDictionary
) et vous ne pouvez pas le forcer à être mutables par moulageNSMutableDictionary
.Au lieu de cela, vous devez créer la mutable dictionnaire à l'aide de
mutableCopy
remplacer l'élément, puis re-affectation du dictionnaire de retour dansNSUserDefaults
: