0

私の問題は、オブジェクトを含む配列をコピーするときです。コピーした配列を変更すると、元の配列も変更されるようです。以下は私のコードの簡略版です。

私はオブジェクトの配列を持っています

@interface TimesViewController (){
    NSMutableArray *route1;
}

ViewDidLoad メソッドでこれらのオブジェクトを埋めます

route1 = [[NSMutableArray alloc] init];

while (sqlite3_step(statement) == SQLITE_ROW) {       

    StopsOnRoutes *stopOnRoutes = [[StopsOnRoutes alloc] init];

    [stopOnRoutes setStart_time:p_time];
    [stopOnRoutes setStart_route_id:p_route];
    [stopOnRoutes setStart_stop_id:p_stop];
    [stopOnRoutes setStop_time:c_time];
    [stopOnRoutes setStop_route_id:c_route];
    [stopOnRoutes setStop_stop_id:c_stop];
    [stopOnRoutes calc];

    [route1 addObject:stopOnRoutes];
}

しかし、route1 をコピーしていくつかの変更を加えようとすると、route1 と amTimes の両方が変更されます

NSMutableArray *amTimes = [[NSMutableArray alloc] init];
[amTimes addObjectsFromArray:route1];

for(int i = 0; i<amTimes.count; i++){
    [[amTimes objectAtIndex:i] setStop_time:[[amTimes objectAtIndex:i] stop_time]-86400];
    [[amTimes objectAtIndex:i] setStart_time:[[amTimes objectAtIndex:i] start_time]-86400];
}

ルート 1 を amTimes にコピーするにはどうすればよいですか。オブジェクトを AM 時間に変更しても、ルート 1 では変更されません。

4

4 に答える 4

2

配列が機能する方法は、配列内のオブジェクトへの参照 (ポインター) を保持するだけです。したがって、オブジェクトを追加するとき、新しいオブジェクトを作成してそれを指すのではなく、まったく同じオブジェクトを指すだけです。あなたがしたいことは、配列内の各オブジェクトをコピーすることを含むディープコピー配列と呼ばれます。

使用するとどうなりますか

- (instancetype)initWithArray:(NSArray *)array copyItems:(BOOL)flag

配列内の各オブジェクトは copyWithZone を送信します。配列に追加する各オブジェクトに copyWithZone を実装してから、

[myArray addObject[myObject copy]];

または、使用することもできます

[[NSArray alloc] initWithArray:otherArray copyItems:YES] //You need to implement copyWithZone in the items you want to copy.

これにより、必要な結果が得られます。

于 2013-11-12T21:54:12.420 に答える
1

StopOnRoutesクラスにNSCopyingプロトコルとメソッドを実装させる必要がありますcopyWithZone:。このメソッドは のコピーを作成する必要がありますself

次に、これを行うことができます:

NSMutableArray *amTimes = [[NSMutableArray alloc] init];
for (StopOnRoutes *obj in route1) {
    [amTimes addObject:[obj copy]];
}
于 2013-11-12T21:53:30.853 に答える
-1

setArray を使用してみてください: すなわち[amTimes setArray:route1];

于 2013-11-12T21:52:51.760 に答える