所以这是我的问题。我正在尝试归档一个对象数组,当我取消归档它们虽然计数相同且根对象内的对象相同但它在unarchived数组中找不到指定的对象。
-(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没有找到相同的对象,我在SAME函数中存档和取消归档没有在数组中找到?归档和取消归档时是否修改了对象?或者还有其他我不想要的东西。
编辑:这是我的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
答案 0 :(得分:3)
这意味着找不到对象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。
答案 1 :(得分:2)
indexOfObject:
使用isEqual:
来测试数组中的对象是否是&#34;相同的&#34;作为您正在寻找的对象。归档和取消归档对象时,生成的对象不在同一内存地址(它实际上是原始对象的副本)。
由于isEqual:
的默认实现仅针对同一对象(内存地址)返回YES,这解释了您所看到的行为。您可能希望覆盖isEqual:
(和hash
,如果覆盖isEqual:
,通常应覆盖它们)以检查对于您的相等概念重要的成员变量。 (或者你可以使用其中一个极好的库来使这更容易,例如Mantle。)