【问题标题】:Copying array of NSNumber复制 NSNumber 数组
【发布时间】:2012-04-07 23:33:40
【问题描述】:

我是 Objective-c 方面的新手,所以如果我的问题太愚蠢,请不要杀我^^

这是我的问题:

*架构:*

我有一个对象:Guest,有一个属性:listOfPricePaidByGuest 该属性是一个 NSNumber 数组。 所有的客人都在这个 NSMutableArray 中:currentListOfBeneficiaries

*情况:*

我有一个 UIViewController,我允许用户修改 listOfPricePaidByGuest

中的值

我想允许用户取消所有修改。 因此,当视图被加载时,我将客人复制到一个新的 mutableArray 中:tempListOfBeneficiaries(我已经实现了 NSMutableCoying 委托并检查了这两个对象是否具有不同的内存地址)。

当用户点击保存时,我只是删除视图,因为所有修改都已完成。

当用户点击 Cancel 时,我只是使用 setArray 方法来处理原始 listOfPricePaidByGuest。

事实是我的 tempArray 中的所有 NSnumber 也都被修改了,我不明白为什么...... 我已经尽力了……

*问题:*

有谁知道使这些值保持不变的方法吗?

*一些代码:*

复制到 tempArray

    for (Guest *newGuest in self.currentGrocery.listOfBeneficiaries)
    {
        // Copying original guest
        Guest *copyGuest = [newGuest mutableCopy];

        for (NSNumber *aNumber in newGuest.listOfPricePaidByGuest)
        {
            int index = [newGuest.listOfPricePaidByGuest indexOfObject:aNumber];

            // Copying NSNumber in newGuest.listOfPricePaidByGuest
            NSNumber *newNumber = [aNumber copy];

            // Replace current object
            [copyGuest.listOfPricePaidByGuest replaceObjectAtIndex:index withObject:newNumber];

            // Releasing current copied number
            [newNumber release];
        }

        // Add it to tempArray
        [self.tempListOfBeneficiaries addObject:copyGuest];

        // Releasing current copiedGuest
        [copyGuest release];
    }

* NSMutableCopying 委托的实现 *

    -(id)mutableCopyWithZone:(NSZone *)zone
    {
        Guest *guestCopy = [[Guest allocWithZone: zone] init];
        [guestCopy setListOfGrocery:self.listOfGrocery];
        [guestCopy setListOfPricePaidByGuest:self.listOfPricePaidByGuest];

        [guestCopy setGuestName:self.guestName];
        [guestCopy setGuestEmail:self.guestEmail];
        [guestCopy setGuestNickname:self.guestNickname];
        [guestCopy setGuestPhone:self.guestPhone];

        [guestCopy setTotalGuestDepense:self.totalGuestDepense];
        [guestCopy setTotalGuestDepenseToPayAfterReeq:self.totalGuestDepenseToPayAfterReeq];

        [guestCopy setIsComming:self.isComming];
        [guestCopy setIsSend:self.isSend];

        return guestCopy;
    }

PS : 对不起英语...已经很晚了...嗯,我是法国人,所以它解释了一切:P

感谢您的帮助:)

【问题讨论】:

  • Tu parle l'anglais mieux que je parle la français。不过为了澄清起见,您希望能够将一个 NSArray 设置为等于另一个?
  • 您需要构造一个新数组,而不仅仅是替换单个数组元素。这应该发生在[Guest mutableCopy] 内。您可以发布您当前的[Guest mutableCopy] 来源吗?此外,如果您想要保存/取消行为,请更改 tempArrayOfBeneficiaries。保存时,将更改复制到currentListOfBeneficiaries。取消时,丢弃它。
  • @CodaFi 谢谢 ^^ 我只是将旧值替换为 currentArray。
  • @Dondragmer 我已经尝试过这样做......但它更复杂......我在使用 NSUserdefaults 保存客人时遇到了一些问题......我添加了我的 mutableCopySource 权利现在:)!
  • @Dondragmer 问题不在于当我试图用旧数组替换我的数组时,我有一个 NSLog 一直显示我的两个数组内容,以及当修改这些 NSNumber完成了,我的两个 NSNumber 数组受到影响!

标签: iphone objective-c copy nsnumber


【解决方案1】:

问题出在数组中,而不是 NSNumbers。目前,你总是有一个数组,从来没有两个。在[Guest mutableCopyWithZone:] 中,您必须复制 listOfGrocery 和 listOfPricePaidByGuest 数组:

[guestCopy setListOfGrocery:[self.listOfGrocery mutableCopy]];
[guestCopy setListOfPricePaidByGuest:[self.listOfPricePaidByGuest mutableCopy]];

最好还是让setListOfGrocerysetListOfPricePaidByGuest 执行此复制步骤,除非有时您需要保留输入数组。如果您使用@property 定义这些,只需将assignretain 替换为copy

另外,这是使用自动引用计数还是垃圾收集?如果没有,副本需要在某个时候发布。

【讨论】:

  • 非常感谢!!它终于奏效了!我不知道这一点,我必须检查我所有的阵列!多亏了你,我可能也纠正了一些其他错误:)
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多