7

olmanın nesnenin rağmen "yöntemi değişmez nesneye gönderilen mutasyona":Ben <code>NSMutableDictionary</code> kullanarak ve bu hatayı Vuruldum NSMutableDictionary

// Turn the JSON strings/data into objects 
    NSError *error; 
    NSMutableDictionary *invoiceDictFromReq = [[NSMutableDictionary alloc] init]; 
// invoiceDictFromReq = (NSMutableDictionary *)[NSJSONSerialization JSONObjectWithData:[request responseData] options:kNilOptions error:&error]; 
    invoiceDictFromReq = [NSMutableDictionary dictionaryWithDictionary:[NSJSONSerialization JSONObjectWithData:[request responseData] options:kNilOptions error:&error]]; 

NSLog(@"invoiceDictFromReq count: %i, key: %@, value: %@", [invoiceDictFromReq count], [invoiceDictFromReq allKeys], [invoiceDictFromReq allValues]); 

// Get values and keys from JSON response 
self.invoiceDict = [invoiceDictFromReq objectForKey:@"invoice"]; 
NSNumber *invoiceAmount = [self.invoiceDict objectForKey:@"amount"]; 
NSNumber *invoiceId = [self.invoiceDict objectForKey:@"id"]; 
NSNumber *invoiceNumber = [self.invoiceDict objectForKey:@"number"]; 
NSNumber *checkoutStarted = [self.invoiceDict objectForKey:@"checkoutStarted"]; 
NSNumber *checkoutCompleted = [self.invoiceDict objectForKey:@"checkoutCompleted"]; 
NSLog(@"amount: %@, id: %@, number: %@, started: %@, completed: %@", invoiceAmount, invoiceId, invoiceNumber, checkoutStarted, checkoutCompleted); 

Tüm konsol günlükleri göstermektedir: Burada

'NSInternalInconsistencyException', reason: '-[__NSCFDictionary removeObjectForKey:]: mutating method sent to immutable object' 

kod veriler iyi. Bu, işlerin yıkılmaya başladığı yer. sonraki görünümü denetleyicisine invoiceDict özelliği geçirmeye:

// Pass the invoice to checkoutViewController 
[checkoutViewController setInvoiceDict:self.invoiceDict]; 

CheckoutViewController.m olarak:

// Change invoice checkoutCompleted to true 
// [self.invoiceDict removeObjectForKey:@"checkoutCompleted"]; 
    [self.invoiceDict setObject:[NSNumber numberWithBool:YES] forKey:@"checkoutCompleted"]; 

hata [self.invoiceDict setObject...] yer almaktadır. Kullandığım tüm sözlüklerin NSMutableDictionary olduğundan emin oldum. Denediğim şeyleri göstermek için koddaki bazı satırları bıraktım ve bir tuğla duvara çarptım. Her zaman yeni bir sözlük oluşturabilirim. Bunu yapmak için tercih edilen yol mu?

cevap

9

InvoiceDictFromReq içine bir sözlük ayırıyorsunuz ve sonra başka bir sözlük oluşturuyorsunuz, orada bir bellek sızıntısı yaratıyorsunuz. hattını

NSMutableDictionary *invoiceDictFromReq = [[NSMutableDictionary alloc] init]; 

Sil Ama sorun bir NSMutableDictionary oluşturan ancak size mutableDictionary içindeki bir sözlük self.invoiceDict ayarı olmasıdır, bu da mutlaka bir mutableDictionary değildir. Varsayılan olarak

self.invoiceDict = [NSMutableDictionary dictionaryWithDictionary:[invoiceDictFromReq objectForKey:@"invoice"]]; 
+0

Teşekkür ama: Burada ayrıştırıcı kesilebilir sözlüğü nasıl olduğunu bana aynı hatayı veriyor. Şimdi, .h içinde bir özellik olarak faturaDictFromReq ve .m içinde syntehsized var ve json isteğinden veri olarak ayarlamak self.invoiceDictFromReq = [NSMutableDictionary sözlük ...] – okysabeni

+1

Üzgünüm ben cevabımı değiştirdim, o değildi. Bakın hala sorun var mı? Yerel bir değişken olduğu için invoiceDictFromReq değerini korumak zorunda değilsiniz, ancak –

+0

:-) sızıntınız olduğundan ilk defa invoiceDictFromReq oluşturduğunuz satırı silin. Gördüğümde, "Ama senin sorunun bir NSMutableDictionary yaratıyorsun ama siz kendi kendineçıkarın. Sözlü ifadelerinizde bir sözlük oluşturuyorsunuz, bu mutlaka bir mutableDictionary değil" diye isabetli olduğunu biliyordum. Bu kadar aptalım. İşaret ettiğin için teşekkürler. Yerel json ayrıştırıcısının NSMutableDictionary döndürdüğünü varsaymamalıydım. Çok teşekkürler! – okysabeni

15

NSJSONSerialization döner değişmez nesneler için çizgi

self.invoiceDict = [invoiceDictFromReq objectForKey:@"invoice"]; 

değiştirin . Hala sonucu

  • kullanım seçeneği NSJSONReadingMutableContainers

veya

  • kullanım mutableCopy öneri için
+1

Tam olarak aradığım şey. Teşekkürler!!! – denikov

+0

MutableCopy kullanmanız gerekmiyor, sadece sonucu kullanın.NSJSONReadingMutableContainers sadece sonuç dizgesinde değil, sonucun kendisinde de diziler ve sözlükler yapar. – gnasher729

İlgili konular