7

されているオブジェクトにもかかわらず、「不変オブジェクトに送られたメソッドを変異さ」:は、私が<code>NSMutableDictionary</code>を使用して、このエラーを打ってる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); 

すべてのコンソールログがあることを示す:

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

ここではコードですデータは問題ありません。これは物事が崩壊し始めるところです。 Iは、次のビューコントローラにinvoiceDictプロパティを渡す:

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

CheckoutViewController.mで:

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

エラーが[self.invoiceDict setObject...]です。私が使用している辞書はすべてNSMutableDictionaryであることを確認しました。私は試したことを示すコードにコメントアウトされた行を残し、レンガの壁に当たった。私はいつも新しい辞書を作ることができると思います。それを行うのが好ましい方法ですか?

答えて

9

あなたはinvoiceDictFromReqに辞書を割り当てており、次に別の辞書を作成しています。そこにはメモリがリークしています。 はライン

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

を削除します。しかし、あなたの問題は、NSMutableDictionaryを作成しているが、あなたはあまりにも必ずしもmutableDictionaryではありません、あなたのmutableDictionary内部辞書を、self.invoiceDictするために設定されていることです。デフォルトで

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

おかげで、それ以下はパーサから可変辞書を取得する方法です同じエラーが表示されます。今、私はinvoiceDictFromReqを.hのプロパティとして使用し、.mでsyntehsizedし、self.invoiceDictFromReq = [NSMutableDictionary dictionary ...]としてデータに設定します。 – okysabeni

+1

申し訳ありませんが、私は自分の答えを変更しました。それでも問題があるかどうかを確認してください。 invoiceDictFromReqはローカル変数なので、保持する必要はありませんが、そこにリークがあるので初めてinvoiceDictFromReqを作成する行は削除してください。 –

+0

:-)。私は "あなたの問題はNSMutableDictionaryを作成しているのですが、mutableDictionary内の辞書をself.invoiceDictに設定していることです。これは必ずしもmutableDictionaryではありません。だから私のことは愚かです。それを指摘してくれてありがとう。ネイティブjsonパーサがNSMutableDictionaryを返すと仮定してはいけません。本当にありがとう! – okysabeni

15

NSJSONSerialization戻り不変オブジェクトのためのライン

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

を変更 。まだ結果に

  • 使用オプションNSJSONReadingMutableContainers

または

  • 使用mutableCopy提案を
+1

私が探していたものとまったく同じです。ありがとう!!! – denikov

+0

mutableCopyを使用する必要はありません。ただ結果を使用してください。NSJSONReadingMutableContainersは、結果内の配列や辞書だけでなく、結果自体も作成します。 – gnasher729

関連する問題