在iOS中将字典值写入文件时无法识别的选择器错误

时间:2011-11-18 04:54:54

标签: iphone ios ipad dictionary alassetslibrary

我正在读取一组ALAsset对象(在头文件中显示为NSMutableArray *assets;)。我正在尝试关注this example以便将ALAssets字典的内容打印到文件以便稍后检索。请注意,我可以正确地将字典键写入文件(注释掉),但不能写入值。

这是我的代码,它运行在viewDidLoad()方法的末尾:

// Create path to Documents
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

if ([paths count] > 0) {
    NSString *dictPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"dict.out"];
    NSDictionary *aDict = [[assets objectAtIndex:0] valueForProperty:ALAssetPropertyURLs];

    for (id key in aDict) {
        NSLog(@"key: %@, value: %@", key, [aDict valueForKey:key]);  
        //[key writeToFile:dictPath atomically:YES];        <- THIS LINE WORKS
        [[aDict valueForKey:key] writeToFile:dictPath atomically:YES];            
    }
}
else
    NSLog(@"nope");    // The program doesn't get here.

日志如下所示:

  

2011-11-17 23:44:41.340 PhotoApp [542:12803] key:public.jpeg,   value:assets-library://asset/asset.JPG?id = 1000000001&amp; ext = JPG

     

2011-11-17 23:44:41.361 PhotoApp [542:12803] - [NSURL   writeToFile:atomically:]:发送到实例的无法识别的选择器   0x6455650

     

2011-11-17 23:44:41.370 PhotoApp [542:12803] *   由于未捕获的异常而终止应用程序   'NSInvalidArgumentException',原因:' - [NSURL   writeToFile:atomically:]:发送到实例的无法识别的选择器   0x6455650'


编辑:不确定是否重要,但该项目针对的是iPad,并且正在模拟器上运行。

2 个答案:

答案 0 :(得分:2)

问题是 [[aDict valueForKey:key] writeToFile:dictPath atomically:YES];行。

key: public.jpeg, value: assets-library://asset/asset.JPG?id=1000000001&ext=JPG

一样 你得到了   public.jpeg

asassets-library://asset/asset.JPG?id=1000000001&ext=JPG

这是一个NSURL对象,所以当你使用时。

[[aDict valueForKey:key] writeToFile:dictPath atomically:YES];
然后

代码[aDict valueForKey:key]返回NSURL无法识别writeToFile:方法的对象。

答案 1 :(得分:1)

方法writeToFile:atomically:仅适用于NSDictionary和NSArray。实际上你在aDict字典中有NSURLs对象。即使对于NSString,实际上已经弃用了。

由于您正在获取URL,请从它们获取NSURL的absoluteString(返回NSString)并使用writeToFile:atomically:encoding:error:将其写入文件

否则,您可以将aDict(NSDictionary)对象本身写入文件。