【问题标题】:NSMutableArray changes to the copy causing changes in the parent NSMutableArray as wellNSMutableArray 对副本的更改也会导致父 NSMutableArray 的更改
【发布时间】:2013-11-05 09:21:41
【问题描述】:

我有一个 NSMutableArray 是我的委托,我也在我的一个视图控制器中使用它。

所以在 viewDidLoad 中,我像这样制作了我的 NSMutableArray 的可变副本

@implementation ItemsViewController{
    AppDelegate *mydelegate;
    NSMutableArray* allItems;
}

在 viewDidLoad 中

allItems = [mydelegate.array mutableCopy];

现在,我在 allItems MutableArray 中所做的任何更改也会导致 mydelegate.array 中的更改。我做错了吗?

我在委托中的数组也定义如下

@property (nonatomic, strong) NSMutableArray *array;

【问题讨论】:

  • 您对 allItems 做了哪些更改?
  • @KudoCC allitems 包含目录。所以我正在更新目录。本质上用 replaceObjectAtIndex 用更新的目录替换旧目录
  • 如果你只是改变 allItems 的结构,我认为它不会影响 mydelegate.array 。如果是这样,我建议您NSLog(@"%@, %@", allItems, mydelegate.array) 检查他们的地址。

标签: ios objective-c


【解决方案1】:

你应该做一个 deepCopy,我使用 this one 并且工作完美,由 Sherm Pendley † 制作。

【讨论】:

  • 当然,但是在使用这个类别时,您还应该实现正确的协议(在这种情况下为 NSMutableCopying)。
【解决方案2】:

我假设您没有正确实现 mutableCopyWithZone:。

您需要为放入数组中的对象实现 NSMutableCopying 协议,这样您就可以为这种情况传递该对象的新实例。

- (id)mutableCopyWithZone:(NSZone *)zone
{
   YourCustomModel *aCopy = [[[self class] allocWithZone:zone] init];
   if (aCopy) {
     // set properties
}
   return aCopy
}

【讨论】:

  • NSMutableString,你能详细说明一下吗?
【解决方案3】:

这是因为数组的可变副本引用的对象与 mydelegate.array 引用的对象相同,因此如果您更改一个对象属性,则两个数组中的属性都会更改,因为它是同一个对象。

你可以在你的对象中实现 NSCopying 协议,然后你可以调用 initWithArray:copyItems: NSArray 方法。

希望对您有所帮助。

【讨论】:

  • Adrián Rodríguez,不是 initWithArray:copyItems: 创建一个 NSArray 吗?我将无法编辑我的数组吗?
  • 当你有你的 NSArray 之后你可以调用 mutableCopy
【解决方案4】:

试试这个。

allitems =[NSMutableArray arrayWithArray:mydelegate.array];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多