首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[NSNull isEqualToString]

[NSNull isEqualToString]
EN

Stack Overflow用户
提问于 2010-10-14 22:53:25
回答 2查看 1.3K关注 0票数 1

由于运行时向NSNull对象发送isEqualToString:,我的程序崩溃了。我找不到这个NSNull的来源;我从来没有显式创建过一个。我也根本找不到谁或者什么在叫isEqualToString。

我的理解是,NSNull是一个对象,它只用于绕过不能将nil添加到集合这一事实。我的程序确实创建了几个自动释放数组;所以我猜测其中一个数组以某种方式以NSNull结尾。奇怪的是,这些数组都不应该包含任何NSString对象,这意味着如果isEqualToString:被发送到我的数组中的一个对象,它将导致崩溃。

我使用CoreData fetch请求和谓词创建这些数组:

代码语言:javascript
复制
 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,如下所示:

代码语言:javascript
复制
    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:消息的实际发送位置?(如果我单步执行,它会在我所有的代码执行完之后发生,我猜是在某个地方有东西被自动释放)。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-16 06:01:17

在几乎整整两天的时间里,除了试图弄清楚这个崩溃,我什么也没做,我找到了它。

事实证明这与我的数组没有任何关系!我有一个正在被观察的物体,在被观察的物体被释放之前,观察者并没有停止观察。我不知道的是,当一个观察对象被释放时,它会通知它的观察者它的值正在更新。具体地说,它们正在更新到NSNull。

因此,我的Client.name属性被更新为NSNull,这会提醒我的观察者它正在被更改。在我的observeValueForKeyPath:方法中,我试图将UILabel的文本更新为新的客户机名,这导致了崩溃。

真正令人恼火的是,我已经经历了一大堆麻烦,以确保当我的观察者被释放时,它停止观察它正在观察的任何东西。现在我不得不进去做更多花哨的事情,以确保在我的客户被释放之前,任何观察它的人都会停止观察它。相当痛苦。

但是它已经修好了!

票数 2
EN

Stack Overflow用户

发布于 2010-10-14 23:07:24

我不习惯处理CoreData fetch请求,但是当我解析JSON时,如果对象已损坏或不是正确的JSON,则对象的id是NSNULL,所以可能在创建数组时出错,系统返回的是NSNull值而不是正确的NSArray,当它尝试查找valueForKey时,它会调用NSNull isEqualToString

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3934499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档