归档可变数组 - doesNotRecognizeSelector异常

Ida*_*dan 3 iphone cocoa-touch objective-c immutability archiving

我有一个"doesNotRecognizeSelector"异常,我怀疑也许我的unarchiver返回不可变数组而不是可变的.我对吗 ?我该如何正确归档和存档?(例外的地方显示)

谢谢!!!

NSMutableArray* arr;

- (void) write
{
         NSMutableData *data = [[NSMutableData alloc] init];
         NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

 NSMutableArray *copy = [[NSMutableArray arrayWithArray:self.Arr] copy];
        [archiver encodeObject:copy forKey:@"Key"];
        [archiver finishEncoding];
        [data writeToFile:[Util DataPath] atomically:YES];
        [archiver release];
        [data release];
        [copyOfPaidPacks release];
}




-(NSMutableArray*) read
{
    NSString* DataPath = [Util FilePath];
    NSData *data = [[NSMutableData alloc] initWithContentsOfFile:DataPath];
    NSKeyedUnarchiver *unarchiver = nil;
    if (data != nil)
    {
            unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];

    if([self.Arr count] <= 0)
    {
        self.Arr = [unarchiver decodeObjectForKey:@"Key"];  
    }
}

[unarchiver finishDecoding];
[unarchiver release];
[data release];
    return self.arr
}

-(void)B
{
     [self write];
     NSMutableArray* SecondArr = [self read];
     [SecondArr sortUsingSelector:@selector(CompareDate:)]; - > `****THIS IS WHERE I GET THE EXCEPTION`
}
Run Code Online (Sandbox Code Playgroud)
  • 编辑

添加比较方法:

- (NSComparisonResult)CompareDate:(T*)p
{
    NSComparisonResult result = [self.changeDate compare:p.changeDate];
    if(result == NSOrderedDescending)
        result = NSOrderedAscending;
    else if(result == NSOrderedAscending)
        result = NSOrderedDescending;

    if(result == NSOrderedSame)
    {
        result = [self CompareName:p];
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

kpe*_*yua 6

NSKeyedUnarchiver确实会返回一个不可变的NSArray.如果你真的想得到一个NSMutableArray,你需要调用-mutableCopy返回值decodeObjectForKey:.

这段代码让我想知道你是否真的需要一个可变数组.看起来你只是对你得到的数组进行排序-read.为什么不直接调用sortedArrayUsingSelector:不可变的NSArray呢?