无法识别的选择器mutableCopyWithZone

时间:2016-06-23 22:07:04

标签: ios objective-c iphone

我正在关注此站点的Core Data教程 http://www.appcoda.com/introduction-to-core-data/

但是我收到以下错误:

2016-06-23 17:55:11.905 MyStore [6020:596233] - [NSAsynchronousFetchResult mutableCopyWithZone :]:无法识别的选择器发送到实例0x7f8950e12eb0

我放置了一个断点,错误似乎来自以下程序。

- (void) viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    //Fetch the devices from the persistent store.
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Device"];
    self.devices = [[managedObjectContext executeRequest:fetchRequest error:nil] mutableCopy]; //error here

    [self.tableView reloadData];
}

我有财产"设备"声明为NSMutableArray。

任何类型的帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:3)

mutableCopy下方正在分层mutableCopyWithZone。这意味着从您的获取请求返回的对象不实现方法mutableCopyWithZone。您可以尝试使用copy方法。仍然需要检查返回的对象以及此对象是否实现方法mutableCopyWithZonecopyWithZone

答案 1 :(得分:3)

所以当我遵循程序时,我使用了错误的方法。

我应该使用的方法是 executeFetchRequest ,而我错误地使用 executeRequest 。第一个确实返回NSArray,但另一个返回NSPersistentStoreResult。

以下是方法。

- (nullable NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error;
- (nullable __kindof NSPersistentStoreResult *)executeRequest:(NSPersistentStoreRequest*)request error:(NSError **)error NS_AVAILABLE(10_10, 8_0);

感谢Volodymyr的帮助,我能够检查我的对象是否确实是我期望的类型不是,从那里我可以改变方法然后我发现返回的对象是一个更复杂的对象,并且具有我可以使用的NSArray属性。

所以这是我的测试代码:)

- (void) viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    //Fetch the devices from the persistent store.
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Device"];

    id whatAreYou = [managedObjectContext executeRequest:fetchRequest error:nil];
    NSLog(@"%@", [whatAreYou class]); // turns out you are a NSPersistentStoreResult
    // lucky for me you are have finalResult property that returns an NSArray. :)

    self.devices = [[whatAreYou finalResult] mutableCopy]; //no more errors here :)

    [self.tableView reloadData];
}

非常感谢你的帮助。从现在开始,我将在调试工具中添加检查对象类型:)