我在Objective-c倾向上很新,所以如果我的问题太愚蠢,请不要杀我^^
我的问题是:
* 架构:*
我有一个带有属性的 Guest : listOfPricePaidByGuest 此属性是NSNumber的数组。 所有来宾都在这个NSMutableArray中: currentListOfBeneficiaries
* 情况:*
我有一个UIViewController,我允许用户修改 listOfPricePaidByGuest
中的值我想允许用户取消所有修改。 因此,当加载视图时,我正在一个新的mutableArray中复制guest虚拟机: tempListOfBeneficiaries (我已经实现了 NSMutableCoying 委托并检查了两个对象是否有不同的记忆地址)。
当用户点击保存时,我正在删除视图,因为所有修改都已完成。
当用户点击取消时,我正在使用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
感谢您的帮助:)
答案 0 :(得分:0)
问题在于数组,而不是NSNumbers。目前,你总是有一个阵列,而不是两个。在[Guest mutableCopyWithZone:]
中,您必须复制listOfGrocery和listOfPricePaidByGuest数组:
[guestCopy setListOfGrocery:[self.listOfGrocery mutableCopy]];
[guestCopy setListOfPricePaidByGuest:[self.listOfPricePaidByGuest mutableCopy]];
除非有时您需要保留输入数组,否则让setListOfGrocery
和setListOfPricePaidByGuest
执行此复制步骤可能会更好。如果您使用@property
定义这些内容,只需将assign
或retain
替换为copy
。
此外,这是使用自动引用计数还是垃圾收集?如果没有,副本需要在某个时候发布。