【问题标题】:Copy Object from NSMutableArray to another NSMutableArray将对象从 NSMutableArray 复制到另一个 NSMutableArray
【发布时间】:2016-04-28 12:24:25
【问题描述】:

这是我的 arrayResult (NSMutableArray):

<__NSArrayM 0x7fd160e365f0>(
{
    Amount = 00;
    Carat = 00;
    Color = D;
    Cut = EX;
    Discount = 00;
    IsSelected = 1;
    Quality = IF;
    Rate = 00;
    Shape = RBC;
    StoneNo = "";
    Symme = EX;
},
{
    Amount = 00;
    Carat = 00;
    Color = D;
    Cut = EX;
    Discount = 00;
    IsSelected = 0;
    Quality = IF;
    Rate = 00;
    Shape = RBC;
    StoneNo = "";
    Symme = EX;
}
)

现在我想将objectNSMutableArray 复制到另一个NSMutableArray。 为此我使用这个:

    [arrayCopyRow addObject:[arrayResult objectAtIndex:0]];

但是我也存储了它的地址,所以如果我更改ValueAtIndex 0,它会自动更改它的复制object

如何防止这种情况发生?如何创建深层副本?

【问题讨论】:

标签: ios objective-c nsmutablearray


【解决方案1】:

为此,您需要一个深拷贝。

所以你可以先运行:

NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:oldArray copyItems:YES];

这将根据 Apple 文档创建一层深层副本,并且数组中的项目需要符合 NSCopying 协议。

如果您只想复制一个对象,您可以使用 newArray 作为临时数组,然后创建并初始化一个新的可变数组,然后像在问题中一样将对象移到那里。

为确保使用上述方法将任何自定义对象复制为深拷贝,您需要在每个类中添加copyWithZone: 方法。

粗略的例子:

-(id) copyWithZone:(NSZone *) zone
{
    ObjectInArray *object = [super copyWithZone:zone];
    object.someValue = self.someValue;
    return object;
}

【讨论】:

  • 注意数组中的项目必须符合NSCopying!
  • @Willeke 不,不是,initWithArray:copyItems 是深拷贝,arrayWithArray: 是浅拷贝。
  • 对不起。我删除了我的评论。
【解决方案2】:

将元素的副本放入另一个数组中。

[arrayCopyRow addObject:[[arrayResult objectAtIndex:0] copy]];

[arrayCopyRow addObject:[[arrayResult objectAtIndex:0] mutableCopy]];

如果你想要所有元素的副本,你可以像 luk2302 说的那样做一个深拷贝。

【讨论】:

    【解决方案3】:

    使用此代码:

    NSMutableArray *array = [yourFirstArray mutableCopy];
    

    【讨论】:

    • 你如何分配你的 NSMutableArray?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多