2016-08-08 2 views
0

NSMutableDictionary割り当て<code>NSMutableDictionary</code>の問題に直面し

私はdictMainある一つのメイン可変辞書、dictSubMainある別の可変辞書を、撮影

、以下のように

宣言ViewController.mファイル内を持っています、

@interface ViewController() 
{ 
    NSMutableDictionary *dictMain; 
    NSMutableDictionary *dictSubMain; 
} 

ここでいくつかの値はdictMain最初はviewDidLoadメソッドから取得します。

私は非常に最初に、私は別の可変辞書dictSubMaindictMainを割り当てています、私はdictSubMainにいくつかの変更をしたが、問題は、私は同じ変更もdictMainに反映することdictSubMainで作っていますどのような変化であるもの別の方法を、持っています。私はdictMainに変更を加えたくありません。

以下の私のコードは、

-(void)addRowsInTable:(NSInteger)index 
{ 
    dictSubMain = [[NSMutableDictionary alloc] initWithDictionary:dictMain]; 

    NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; 
    NSMutableDictionary *tmpDic = [[NSMutableDictionary alloc] init]; 

    [tmpDic setObject:self.btnTTNumDent.currentTitle forKey:kNUMDENT_T]; 
    [tmpDic setObject:self.btnTTSizeDent.currentTitle forKey:kSIZEDENT_T]; 
    [tmpArray addObject:tmpDic]; 
    [[[dictSubMain valueForKey:kDATA] objectAtIndex:index] setObject:tmpArray forKey:kTABLE]; 
} 

誰もがそれを解決するために私を助けることができます!前もって感謝します。

+0

自分自身と他の人を混乱させるのをやめてください。プロパティを宣言します。また、インスタンス変数をアンダースコアで始めるようにします。プロパティ、インスタンス変数、グローバル変数、パラメータ、ローカル変数はすべてコード内で同じに見えるので、バグを見つけにくいでしょう。また、valueForKeyは使用しないでください。そのドキュメントを読んで使用したい場合はそれを使用しますが、理由はありません。 – gnasher729

答えて

1

dictSubMain[kDATA]は可変辞書の配列であるように見えます。 [[NSMutableDictionary alloc] initWithDictionary:dictMain]dictMainの浅いコピーを作成するので、dictSubMainにはkDATAという配列の同じインスタンスが含まれているため、問題が発生している可能性があります。です。

代わりにディープコピーを実行する必要があります。そのための方法は簡単に検索されます。私は確信しているので、多くの答えがあります。

+0

まあ!私にチェックさせてください。ありがとうございました。 – Gati

+0

あなたの提案をありがとう、http://stackoverflow.com/a/1950920/3825016ディープコピーは私のために働いた。 (Y) – Gati

0

これを試してください:あなたはNSMutable*スタイルの使用copyキーワードを使用するたびに、それが存在する理由

@property(nonatomic, copy) NSMutableDictionary *dictMain; 
@property(nonatomic, copy) NSMutableDictionary *dictSubMain; 

は実は実際に、それはです。

または変更:

dictSubMain = [[NSMutableDictionary alloc] initWithDictionary:dictMain]; 

へ:

dictSubMain = [[NSMutableDictionary alloc] initWithDictionary:dictMain copyItems:YES]; 
+0

これらは機能的に同一であり、あなたの答えは彼の問題を解決しません。 – Avi

+0

上記の1つを試しても動作しません! – Gati

+0

copyプロパティを実際に追加しようとします。あなたが 'NSMutable'スタイルを使うときはいつでも' copy'キーワードを使います。 –