0

我在抛出异常错误的类别中调用一个函数:

-[NSPathStore2 countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x1f5572b0

该块内引发错误。

NSArray *shindys = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSError *error = nil;
__weak UIManagedDocument *shindyDatabase = self.shindyDatabase;
dispatch_queue_t downloadQueue = dispatch_queue_create("Shindy Fethcer", nil);
dispatch_async(downloadQueue, ^{
    for (NSDictionary *shindyInfo in shindys) {
        [Shindy shindyWithShindyDBInfo:shindyInfo inManagedObjectContext:shindyDatabase.managedObjectContext];
        [shindyInfo setValue:self.detailView.text forKey:@"details"];
        NSLog(@"This is getting performed.");
    }
});

预先分配NSDictionary没有帮助。

4

2 回答 2

2

'shindys' 不是 NSArray。如果您停止调用 -objectAtIndex:,它将是。

于 2012-12-22T04:40:35.690 回答
1

在幕后,一个for(element in container)循环使用countByEnumeratingWithState:objects:count:消息来枚举容器的元素。

该类NSPathStore2NSString系统用于已知为文件系统路径的字符串的子类。

异常消息告诉您NSPathStore2不支持该countByEnumeratingWithState:objects:count:消息。

这是有道理的,因为NSString(和NSPathStore2子类)不是对象容器。

NSSearchPathForDirectoriesInDomains函数确实返回一个NSArray(这是一个可以在for/in循环中使用的对象容器),但是您正在NSPathStore2使用objectAtIndex:. 因此,即使您声明shindysNSArray,您实际上是在将其设置为NSPathStore2

你调用的方式NSSearchPathForDirectoriesInDomains,它总是会返回一个单元素数组,所以使用它的第一个元素的想法objectAtIndex:很好。没有理由尝试枚举它的所有元素,因为它只有一个元素。

此外,在您的块中,您发送setValue:forKey:shindyInfo,期望shindyInfo成为字典。但即使shindys是一个数组,它也会是一个字符串数组,因为这就是NSSearchPathForDirectoriesInDomains返回的内容。并且字符串没有任何可以设置的属性setValue:forKey:

这段代码很乱。目前尚不清楚您要做什么,但我认为您不了解NSSearchPathForDirectoriesInDomains.

于 2012-12-22T04:44:58.867 回答