存档/取消存档时是否修改了对象?

问题描述:

所以这是我的问题。我试图归档一个对象数组,当我将它们取消归档时,虽然count是相同的,并且根对象内的对象是相同的,但它在未归档的数组中找不到指定的对象。存档/取消存档时是否修改了对象?

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"self.vendors.count = %d", self.vendors.count); 
    [NSKeyedArchiver archiveRootObject:self.vendors toFile:[self vendorsArchivePath]]; 

    NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:[self 
           vendorsArchivePath]]; 
    NSLog(@"array.count = %d", array.count); 
    NSLog(@"%d", [self.vendors indexOfObject:self.vendors[indexPath.row]]); 
    NSLog(@"%d", [array indexOfObject:self.vendors[indexPath.row]]); 
} 

为了排除故障;我有两个数组的列表和底部的计数和NSLog中每个数组中的对象的索引。

这里是日志...

2014-04-27 12:53:04.813 Inventory[12272:907] self.vendors.count = 5 
2014-04-27 12:53:04.827 Inventory[12272:907] array.count = 5 
2014-04-27 12:53:04.828 Inventory[12272:907] 0 
2014-04-27 12:53:04.831 Inventory[12272:907] 2147483647 

所以我的问题是:为什么在世界上是最后的NSLog没有找到相同的对象,我存档,并在不被发现在同样的功能未归档数组?对象是否在存档和未存档时进行修改?或者还有其他的东西我失踪了。

编辑:这是我的vendor.h和vendor.m文件:

//vendor.h 
#import <Foundation/Foundation.h> 

@interface SELVendor : NSObject <NSCoding> 

@property (nonatomic) NSMutableArray *itemsAvailable; 
@property (nonatomic) NSString *name; 
@property (nonatomic) NSString *phoneNumber; 
@property (nonatomic) NSString *email; 
@property (nonatomic) NSString *vendorKey; 

@end 

//vendor.m 
#import "SELVendor.h" 

@implementation SELVendor 

-(instancetype) init { 
    self = [super init]; 
    if (self) { 
     self.name = @"Unnamed Vendor"; 
     self.itemsAvailable = [[NSMutableArray alloc] init]; 

     NSUUID *uuid = [[NSUUID alloc] init]; 
     self.vendorKey = [uuid UUIDString]; 
    } 
    return self; 
} 

-(void)encodeWithCoder:(NSCoder *)aCoder { 
    [aCoder encodeObject:self.name forKey:@"name"]; 
    [aCoder encodeObject:self.itemsAvailable forKey:@"itemsAvailable"]; 
    [aCoder encodeObject:self.phoneNumber forKey:@"phoneNumber"]; 
    [aCoder encodeObject:self.email forKey:@"email"]; 
    [aCoder encodeObject:self.vendorKey forKey:@"vendorKey"]; 
} 

-(instancetype)initWithCoder:(NSCoder *)aDecoder { 
    self = [super init]; 
    if (self) { 
     self.name = [aDecoder decodeObjectForKey:@"name"]; 
     self.itemsAvailable = [aDecoder decodeObjectForKey:@"itemsAvailable"]; 
     self.phoneNumber = [aDecoder decodeObjectForKey:@"phoneNumber"]; 
     self.email = [aDecoder decodeObjectForKey:@"email"]; 
     self.vendorKey = [aDecoder decodeObjectForKey:@"vendorKey"]; 
    } 
    return self; 
} 

@end 
+1

什么样的对象是“供应商”?你在那个对象中实现了'isEqual:'吗? –

这意味着该对象未找到2147483647 == NSNotFound

什么你想要做的是保存阵列的物体,然后将它们读回到一个可变的区域。这样做会再次创建(alloc/init)对象,以便它们不会占用内存中的相同位置。根据您如何实现编码器/解码方法,对象可能与另一个完全相同(内容明智)。你需要做的是在你的课程中覆盖isEqual:(和hash)并检查那里的对象。

如果你的对象有某种ID财产,你可以这样做:

-(BOOL)isEqual:(id)object 
{ 
    if (self == object) { 
     return YES; 
    } 
    if (![object isKindOfClass:[self class]]) { 
     return NO; 
    } 
    return [self.ID isEqual:object.ID]; 
} 

如果没有你的对象上的属性都是独一无二的,你可以检查每一个在isEqual:方法。

有关更多信息,请参阅this answer

+0

这可能是两个答案中最有利的。我认为最好在你的回答中包括为什么他们不是完全相同的对象(分配一个新的内存位置,就像Jesse指出的那样)。 – Scott

+0

@Scott会这样做,但你是否在乎他们不在相同的内存地址?从同样的想法出发,他们是同一个对象?尽管我在答复中说过“他们不会是同一个对象”,但我的意思是他们不会占用同一块内存。在那里回答我自己的问题! – Rich

+0

不,不要紧。无论如何,它都会被归档,所以当非存档时,每个对象最有可能位于不同的内存地址 - 只需要匹配itemKey即可。就“同一个对象”而言,它对我来说并不那么清楚。 :D – Scott

indexOfObject:使用isEqual:来测试数组中的对象是否与您正在查找的对象“相同”。归档和取消归档对象时,生成的对象不在相同的内存地址(它实际上是原始对象的副本)。

由于isEqual:的默认实现仅对同一对象(内存地址)返回YES,因此这解释了您所看到的行为。您可能想要覆盖isEqual:(和hash,如果您覆盖isEqual:,通常应该覆盖该值),以检查任何成员变量对于您的平等概念是否重要。 (或者你可以使用其中一个易于使用的zillion库,例如Mantle。)