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)
NSKeyedUnarchiver确实会返回一个不可变的NSArray.如果你真的想得到一个NSMutableArray,你需要调用-mutableCopy返回值decodeObjectForKey:.
这段代码让我想知道你是否真的需要一个可变数组.看起来你只是对你得到的数组进行排序-read.为什么不直接调用sortedArrayUsingSelector:不可变的NSArray呢?