2014-04-27 24 views
2

所以這是我的問題。我試圖歸檔一個對象數組,當我將它們取消歸檔時,雖然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:'嗎? –

回答

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

+0

這可能是兩個答案中最有利的。我認爲最好在你的回答中包括爲什麼他們不是完全相同的對象(分配一個新的內存位置,就像Jesse指出的那樣)。 – Scott

+0

@Scott會這樣做,但你是否在乎他們不在相同的內存地址?從同樣的想法出發,他們是同一個對象?儘管我在答覆中說過「他們不會是同一個對象」,但我的意思是他們不會佔用同一塊內存。在那裏回答我自己的問題! – Rich

+0

不,不要緊。無論如何,它都會被歸檔,所以當非存檔時,每個對象最有可能位於不同的內存地址 - 只需要匹配itemKey即可。就「同一個對象」而言,它對我來說並不那麼清楚。 :D – Scott

2

indexOfObject:使用isEqual:來測試數組中的對象是否與您正在查找的對象「相同」。歸檔和取消歸檔對象時,生成的對象不在相同的內存地址(它實際上是原始對象的副本)。

由於isEqual:的默認實現僅對同一對象(內存地址)返回YES,因此這解釋了您所看到的行爲。您可能想要覆蓋isEqual:(和hash,如果您覆蓋isEqual:,通常應該覆蓋該值),以檢查任何成員變量對於您的平等概念是否重要。 (或者你可以使用其中一個易於使用的zillion庫,例如Mantle。)

相關問題