由于运行时向NSNull对象发送isEqualToString:,我的程序崩溃了。我找不到这个NSNull的来源;我从来没有显式创建过一个。我也根本找不到谁或者什么在叫isEqualToString。
我的理解是,NSNull是一个对象,它只用于绕过不能将nil添加到集合这一事实。我的程序确实创建了几个自动释放数组;所以我猜测其中一个数组以某种方式以NSNull结尾。奇怪的是,这些数组都不应该包含任何NSString对象,这意味着如果isEqualToString:被发送到我的数组中的一个对象,它将导致崩溃。
我使用CoreData fetch请求和谓词创建这些数组:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"property.name CONTAINS[cd] %@ OR client.name CONTAINS[cd] %@", self.searchDisplayController.searchBar.text, self.searchDisplayController.searchBar.text];
request.entity = [NSEntityDescription entityForName:@"SearchIndex" inManagedObjectContext:appDelegate.rootViewController.managedObjectContext];
request.predicate = predicate;
[request setFetchLimit:0];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"client" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"property" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
request.sortDescriptors = sortDescriptors;
[sortDescriptors release];
[sortDescriptor1 release];
[sortDescriptor2 release];
NSError *error = nil;
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:@"client" cacheName:nil];
self.resultsController = controller;
[controller release];
[self.resultsController performFetch:&error];
[request release];稍后,我进一步过滤fetchedResults,如下所示:
id <NSFetchedResultsSectionInfo> sectionInfo = [self.resultsController.sections objectAtIndex:section];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"property.name CONTAINS[cd] %@", self.searchDisplayController.searchBar.text];
NSArray *array = [sectionInfo.objects filteredArrayUsingPredicate:predicate];
return [array valueForKey:@"property"];是什么导致NSNull最终出现在这些数组中?在创建数组之后,我没有看到任何NSNull对象。是否还有其他因素可能导致创建NSNull,特别是在系统期望NSString的位置创建?有没有办法使用调试器来跟踪isEqualToString:消息的实际发送位置?(如果我单步执行,它会在我所有的代码执行完之后发生,我猜是在某个地方有东西被自动释放)。
谢谢!
发布于 2010-10-16 06:01:17
在几乎整整两天的时间里,除了试图弄清楚这个崩溃,我什么也没做,我找到了它。
事实证明这与我的数组没有任何关系!我有一个正在被观察的物体,在被观察的物体被释放之前,观察者并没有停止观察。我不知道的是,当一个观察对象被释放时,它会通知它的观察者它的值正在更新。具体地说,它们正在更新到NSNull。
因此,我的Client.name属性被更新为NSNull,这会提醒我的观察者它正在被更改。在我的observeValueForKeyPath:方法中,我试图将UILabel的文本更新为新的客户机名,这导致了崩溃。
真正令人恼火的是,我已经经历了一大堆麻烦,以确保当我的观察者被释放时,它停止观察它正在观察的任何东西。现在我不得不进去做更多花哨的事情,以确保在我的客户被释放之前,任何观察它的人都会停止观察它。相当痛苦。
但是它已经修好了!
发布于 2010-10-14 23:07:24
我不习惯处理CoreData fetch请求,但是当我解析JSON时,如果对象已损坏或不是正确的JSON,则对象的id是NSNULL,所以可能在创建数组时出错,系统返回的是NSNull值而不是正确的NSArray,当它尝试查找valueForKey时,它会调用NSNull isEqualToString
https://stackoverflow.com/questions/3934499
复制相似问题