2012-05-09 7 views
0

私は2つの単純なNSMutableArrayをいくつかのオブジェクトで構成しています。これらのオブジェクトの中には、一般的なものもあれば、両方の配列の用途がまったく異なる目的のために定義されているため、両方の配列に格納する必要があります。保持カウントを増やさずに2つの異なるNSMutableArrayに値を追加する

しかし、同じオブジェクトを両方の配列に追加した後、共通オブジェクトの1つの値を変更すると2番目の配列に反映されないという問題があります。例えば

のは、我々は2可変にNSArrayを持っているとしましょう:

NSMutableArray *mutableArrayOne; 
NSMutableArray *mutableArrayTwo; 

は、今度は、これらの配列が含まれている必要がありますオブジェクト定義を作成してみましょう。

@interface: DummyObject : NSObject 
{ 
    int objectValue; 
} 

@property (nonatomic) int objectValue; 

-(void) printObjectValue; 

@end 

次に、配列を格納するための基本クラスを作成しましょう。

基本クラス定義

@interface: BaseClass : NSObject 
{ 
    NSMutableArray *mutableArrayOne; 
    NSMutableArray *mutableArrayTwo; 
} 
-(void) init; 
-(void) printBothArrays; 

@end 

基本クラスの実装

@implementation BaseClass 

-(void) init 
{ 
    // initialize the mutable array. 
    mutableArrayOne = [[NSMutableArray alloc] initWithCapicity:5]; 
    mutableArrayTwo = [[NSMutableArray alloc] initWithCapicity:5]; 

    DummyObject *dummyObject = [DummyObject alloc]; 
    [dummyObject setObjectValue:5]; 

    DummyObject *dummyObjectTwo = [DummyObject alloc]; 
    [dummyObjectTwo setObjectValue:2]; 

    [mutableArrayOne addObject:dummyObject]; 
    [mutableArrayOne addObject:dummyObjectTwo]; 

    [mutableArrayTwo addObject:dummyObjectTwo]; 

} 

@end 

今私は、配列の一つでDummyObjectを変更してみましょう:

for (DummyObject* dummyObject in mutableArrayOne) 
{ 
    [dummyObject setValue:100]; 
} 

問題 は今ここに私は両方の配列オブジェクトの値を印刷しています問題を開始: -

印刷まずアレイを

for (DummyObject* dummyObject in mutableArrayOne) 
{ 
    [dummyObject printObjectValue]; 
} 

* (最初の配列から)出力ログ*

100 
100 

第2の配列

for (DummyObject* dummyObject in mutableArrayTwo) 
{ 
    [dummyObject printObjectValue]; 
} 

* 出力ログ(二番目の配列から)*

2 

そこでここではMutableArrayは、オブジェクトのコピーを保持していることがわかります、しかし、私は唯一の参照を格納します。つまり、1番目の配列のオブジェクトの値を変更すると2番目の配列に反映されるはずです。

どうすればいいですか? 他の選択肢はありますか?

おかげで、 パラスMendiratta

+0

コード例に入力アドレスがありますか?最初の配列からの出力は2 100sを返し、2番目の配列からの出力は1 2を返します。つまり、2番目のオブジェクトを最初の配列に追加し、1を2番目の配列に追加します。 (あなたのスペルミスは、最初の配列にそれらを追加することになります) – Pochi

+0

ありがとう、私はサンプルコードを修正しました。 – codesnooker

+1

あなたのコードがまさにそのようなものなら、gettin 100ではない2番目の可変配列を印刷するよりも確実ですか? – Pochi

答えて

0

これは理想的に動作しますが、オブジェクトを設定すると、いくつかの問題のように思えます。 あなたはこのように確認することができます -

NSMutableString *firstString = [[NSMutableString alloc] initWithString:@"first"]; 
NSMutableString *secondString = [[NSMutableString alloc] initWithString:@"second"]; 

NSMutableArray *originalArray = [[NSMutableArray alloc] initWithObjects: firstString, secondString, nil]; 
NSMutableArray *copyArray = [[NSMutableArray alloc] initWithObjects: firstString, secondString, nil]; 

[[copyArray objectAtIndex:0] appendString:@"add some text"]; 

for (int index = 0; index < [originalArray count]; index++) { 
    NSLog(@"Original:%@ --- copy:%@", [originalArray objectAtIndex:index], [copyArray objectAtIndex:index]); 
} 

し、出力をある -

2012-05-09 10:28:40.382 Demo[5237:f803] Original:firstadd some text --- copy:firstadd some text 
2012-05-09 10:28:40.384 Demo[5237:f803] Original:second --- copy:second 

EDIT - (初期化時にオブジェクトを追加しません)

NSMutableString *firstString = [[NSMutableString alloc] initWithString:@"first"]; 
NSMutableString *secondString = [[NSMutableString alloc] initWithString:@"second"]; 

NSMutableArray *originalArray = [[NSMutableArray alloc] init]; 
NSMutableArray *copyArray = [[NSMutableArray alloc] init]; 

[originalArray addObject:firstString]; 
[copyArray addObject:firstString]; 

[originalArray addObject:secondString]; 
[copyArray addObject:secondString]; 

[[copyArray objectAtIndex:0] appendString:@"add some text"]; 

for (int index = 0; index < [originalArray count]; index++) { 
    NSLog(@"Original:%@ --- copy:%@", [originalArray objectAtIndex:index], [copyArray objectAtIndex:index]); 
} 

出力 -

2012-05-09 11:11:18.275 Demo[5433:f803] Original:firstadd some text --- copy:firstadd some text 
2012-05-09 11:11:18.277 Demo[5433:f803] Original:second --- copy:second 
+0

申し訳ありませんが、配列の初期化時にオブジェクトを設定することはできません。オブジェクトは、実行時にユーザーの操作によって作成されます。だから私は実行時にのみオブジェクトを追加する必要があります。 – codesnooker

+0

initの後にoriginalArrayとcopyArrayにaddObjectを追加しようとするとどうでしょうか。そして、配列の1つでオブジェクトを修正して、結果を出力してみてください。結果は同じではありません。 : – codesnooker

+0

@codesnooker - まだ同じ結果がsetValueはあなたのカスタムメソッドですか? – rishi

関連する問題