gpt4 book ai didi

ios - 归档/取消归档时对象是否被修改?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:28:17 26 4
gpt4 key购买 nike

所以这是我的问题。我正在尝试归档一个对象数组,当我取消归档它们时,尽管计数相同并且根对象内的对象相同,但它在未归档的数组中找不到指定的对象。

-(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

最佳答案

这意味着找不到对象 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了解更多信息。

关于ios - 归档/取消归档时对象是否被修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23328271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com