NSMutableDictionary: muterer metode, der sendes til uforanderlige objekt

Følgende kode returnerer en undtagelse med følgende fejlmeddelelse “muterer metode, der sendes til uforanderlige objekt”, når du forsøger at 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;

Ikke sikker på, hvad problemet er, måske det skyldes at hente ordbogen fra en NSUserDefaults.

Dog følgende kode virker uden problemer.

NSMutableDictionary * storedIpDictionary = (NSMutableDictionary*)[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"dictDeviceIp"];
[storedIpDictionary removeAllObjects];
Hvad betyder fejlmeddelelsen sige? Hvad tror du det betyder? Hvad er en uforanderlig objekt? Gør støbning en NSDictionary til en NSMutableDictionary pointer gøre ordbogen foranderlig?
Jeg er ikke sikker på, hvorfor det er en NSDictionary, som NSUserDefault er defineret som en NSMutableDictionary – @ejendom (nonatomic, fastholde) NSMutableDictionary* dictDeviceIp;
Ikke sikker på, hvorfor dette spørgsmål fik downvoted, dette løste mit problem.
Tak Bob, folk er alt for hurtige på ned-afstemning, ofte har gjort før i læser hele spørgsmål. Anyway, det er godt at se, at denne post er tilbage i den positive! Og dette er på trods af alle disse ned stemmer, hvilket betyder, at en masse mennesker blev hjulpet.

OriginalForfatteren Remixed123 | 2014-08-04

6 svar

  1. 55

    NSUserDefaults returnerer uforanderlige objekter, selv hvis du lægger i en foranderlig dem. Du skal ringe -mutableCopy om den returnerede værdi er at få en foranderlig samling.

    Dette bør være accepteret svar
    tak @catfish_Man virkelig godt svar

    OriginalForfatteren Catfish_Man

  2. 3

    Du kan ikke bare kaste en NSDictionary at NSMutableDictinary thats slet ikke, hvordan støbning værker.

    at fjerne en nøgle fra NSUserDefualts opkald removeObjectForKeyNSUserDefaults instans selv.

    hvis du virkelig ønsker en ordbog af en eller anden grund, så skal du lave en mutableCopy fra ordbogen opnået ved dictionaryForKey.

    OriginalForfatteren Brad Allred

  3. 3

    Dette er den kode, der i sidste ende arbejdede, brugte jeg nogle af de oplysninger, der leveres fra andre ovenfor, men ingen havde det helt forklaret.

    - (void)cleanDictionary
    {
        NSMutableDictionary * storedIpDictionary = [[[NSUserDefaults standardUserDefaults] objectForKey: @"dictDeviceIp"] mutableCopy];
    
        [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"dictDeviceIp"];
    
        NSString *oldKey = self.currentDeviceNameText.text;
        NSString *newKey = self.deviceNameChangeText.text;
        NSString *ipAddressTemp = [storedIpDictionary objectForKey:oldKey];
    
        //Make some change to the structure
        [storedIpDictionary removeObjectForKey:oldKey];  //Remove object
        storedIpDictionary[newKey] = ipAddressTemp;      //Add object with new key
    
        //Add it the whole thing back into NSUserDefaults
        [[NSUserDefaults standardUserDefaults] setObject:storedIpDictionary forKey:@"dictDeviceIp"];
    
        //Synchronize to ensure it's saved
        [[NSUserDefaults standardUserDefaults] synchronize];
    }

    OriginalForfatteren Remixed123

  4. 3

    hvis du på fejl NSMutableDictionary: muterer metode, der sendes til uforanderlige objekter i Hurtig, gør dette trin:

    Dette er, fordi du har tildelt en NSUserDefault at NSMutableArray, når du tager noget NSUserDefault den returnerer du en NSArray ikke en NSMutableArray, så i dette tilfælde er du nødt til at bruge en NSMutableArray Ekstra .

    se, at Swift :

    var Products:NSMutableArray = NSMutableArray()
    
    
    override func viewDidAppear(animated: Bool) {
    
        if let Produtos = NSUserDefaults.standardUserDefaults().valueForKey("Produtos") {
            Products = Produtos as! NSMutableArray
        }
    }
    
    func InsertProducts(productCode:String){
         //COPY Products Atual for auxMutable
         var auxMutable = Products.mutableCopy()
    
            //Add object in auxMutable
            auxMutable.addObjectsFromArray([productCode])
    
            //in line back data to Array Products and make cast to NSMutableArray
            Products = auxMutable as! NSMutableArray
    
            //Refresh Data of NSUserDefaults
            NSUserDefaults.standardUserDefaults().setObject(Products, forKey: "Produtos")
    }
    
    
    @IBAction func Bt_New_Product(sender: AnyObject) {
         var ProductName:String = TXT_NameProduct.text
    
         InsertProducts(ProductName)
    }

    Dette arbejde for mig!!!

    OriginalForfatteren Pablo Ruan

  5. 3

    fandt jeg samme problem og fundet en løsning, håber det vil hjælpe nogen.

    arrayOfferId = defaults.objectForKey("offerId")?.mutableCopy() as! NSMutableArray

    NSUserDefaults returnerer uforanderlige objekter, selv hvis du lægger i en foranderlig dem. Du skal ringe -mutableCopy om den returnerede værdi er at få en foranderlig samling. så når du får værdi fra NSUserDefault bruge mutableCopy()

    OriginalForfatteren Ayaz Akbar

  6. 2

    [NSUserDefaults dictionaryForKey] returnerer en uforanderlig ordbog ( NSDictionary ), og du kan ikke tvinge den til at være foranderlig ved at kaste det til NSMutableDictionary.

    I stedet skal du oprette mutable ordbogen ved hjælp af mutableCopy, overskrive element, og derefter re-tildeling af ordbogen tilbage i NSUserDefaults:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSMutableDictionary *storedIpDictionary = [[userDefaults dictionaryForKey:@"dictDeviceIp"] mutableCopy];
    
    NSString *key = self.currentDeviceNameText.text;
    NSString *ipAddressTemp = [storedIpDictionary objectForKey:key];
    
    //Don't need this line
    //[storedIpDictionary removeObjectForKey:key];
    
    storedIpDictionary[key] = ipAddressTemp;
    [userDefaults setObject:storedIpDictionary
                     forKey:@"dictDeviceIp"];

    OriginalForfatteren Droppy

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *