[__NSArrayM getFileSystemRepresentation:maxLength:]: 无法识别的选择器发送到实例
Posted
技术标签:
【中文标题】[__NSArrayM getFileSystemRepresentation:maxLength:]: 无法识别的选择器发送到实例【英文标题】:[__NSArrayM getFileSystemRepresentation:maxLength:]: unrecognized selector sent to instance 【发布时间】:2012-11-11 10:02:18 【问题描述】:我有以下代码来加载一些文件并将它们保存到磁盘:
NSDictionary *dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:[NSData dataWithContentsOfURL:url]];
// THE LINE BELOW IS WHERE THE EXCEPTION OCCURS
NSMutableArray *paths = [[NSMutableArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithFile:[dictionary objectForKey:@"paths"]]];
if(dictionary)
dispatch_async(dispatch_get_main_queue(), ^
NSLog(@"DOWNLOADED PATHS: %@", paths);
NSFileManager *filemgr;
NSString *docsDir;
NSArray *dirPaths;
filemgr = [NSFileManager defaultManager];
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
for(NSObject *obj in paths)
NSString *identification = [defaults objectForKey:@"LatestID"];
NSString *pageno = [NSString stringWithFormat:@"%i", [paths indexOfObject:obj]];
NSString *name = [NSString stringWithFormat:@"%@paths%@.archive", identification, pageno];
NSString *dataFilePath = [[NSString alloc] initWithString: [docsDir
stringByAppendingPathComponent:name]];
[NSKeyedArchiver archiveRootObject:paths toFile:dataFilePath];
);
但是,当我运行这段代码时,出现以下异常:
* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayM getFileSystemRepresentation:maxLength:]:无法识别的选择器发送到实例 0xc8809e0” * 首先抛出调用栈: (0x3623012 0x3448e7e 0x36ae4bd 0x3612bbc 0x361294e 0x2e2d7b4 0x2e2d762 0x2e5bc85 0x2e83c7a 0x2e83c7a 0x8d98 0x4053f 0x4072014 0x4063450 0x4063450 0x953362012 0x9533450 0x9533620 0x953362CCA) libc++abi.dylib:终止调用抛出异常 (lldb)
为什么会这样?
【问题讨论】:
发生这种情况是因为 'dictionary' 为 nil 或 [dictionary objectForKey:@"paths"] 为 nil。分配后检查字典的值。还要检查 [NSData dataWithContentsOfURL:url] 是否不为零。 @NikosM 呃,一点也不。如果是nil
,则会抛出另一个异常。
说“下面的那一行是异常发生的地方”并没有多大用处,然后在那一行上做 100 件事!将行分解为每个单独的操作,看看你的错误发生在哪里。
【参考方案1】:
可疑行上的[dictionary objectForKey:@"paths"]
似乎包含NSMutableArray
而不是NSString
。也许你的意思是[[dictionary objectForKey:@"paths"] objectAtIndex:0]
。
【讨论】:
它应该包含一个 NSMutableArray @PixelBitAppsLtd 很好,它仍然不是NSString
。 unarchiveObjectWithFile:
接受 NSString
参数,以防您没有阅读文档(您应该为此感到难过)。
那有没有另一种方法可以“归档”和“取消归档”NSMutableArray?我必须将其发送到服务器,然后再次下载。它需要采用合适的格式才能放入 NSDictionary :-)
@PixelBitAppsLtd 如果您使用- [NSArray writeToFile:atomically:]
将数组写入文件,那么您可以简单地使用+ [NSArray arrayWithContentsOfFile:]
来检索它。
但我需要将其添加到 NSDictionary,这就是为什么我认为最好将其存档:(以上是关于[__NSArrayM getFileSystemRepresentation:maxLength:]: 无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章
集合 <__NSArrayM: 0x7fa1f2711910> 在枚举时发生了突变
在映射集合时快速获取异常“所需类型 = NSOrderedSet;给定类型 = __NSArrayM”
[__NSArrayM objectAtIndex:]: 索引 9223372036854775807 超出范围 [0 .. 13]'
异常'NSRangeException',原因:'*** -[__NSArrayM objectAtIndex:]:索引 19 超出范围 [0 .. 18]'
[__NSArrayM objectAtIndex:]: 索引 2 超出范围 [0 .. 1]'
NSRangeException',原因:'*** -[__NSArrayM objectAtIndex:]:空数组的索引 5 超出范围'