0

いくつかのオブジェクトで構成される単純な NSMutableArray が 2 つあります。これらのオブジェクトの一部は共通ですが、両方の配列の用途がまったく異なる目的で定義されているため、両方の配列に格納する必要があります。

ただし、問題は、両方の配列に同じオブジェクトを追加した後、共通オブジェクトの 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

次に、配列 One の 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 番目の配列から) *

2

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

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

ありがとう、 パラス・メンディラッタ

4

1 に答える 1

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

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

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
于 2012-05-09T04:59:23.177 に答える