代码之家  ›  专栏  ›  技术社区  ›  GendoIkari

[nsnull IsEqualToString]

  •  1
  • GendoIkari  · 技术社区  · 15 年前

    由于运行时向nsnull对象发送isEqualToString:而导致程序崩溃。我找不到这个nsnull的来源;我从未明确创建过一个。我也根本找不到谁或什么叫IsEquatoString。

    我的理解是,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];
    

    稍后,我进一步过滤提取结果,如下所示:

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

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  1
  •   GendoIkari    15 年前

    好吧,经过近2天的无所事事,只想弄清楚这次车祸,我发现了。

    结果发现这和我的阵列无关!我有一个被观察到的物体,在被观察到的物体被释放之前,观察者没有停止观察。我不知道的是,当一个观察对象被释放时,它会通知它的观察者它的值正在被更新。具体来说,它们将被更新为nsnull。

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

    真正令人恼火的是,我已经不得不穿过一堆铁圈,以确保当我的观察者被释放时,它停止观察它所观察到的任何东西。现在我不得不进去做一些更花哨的事情,以确保在我的客户被交易之前,任何观察到它的东西都停止观察它。非常痛苦。

    但它是固定的!

        2
  •  0
  •   JonLOo    15 年前

    我不习惯处理coredata fetch请求,但是当我分析一个json时,如果对象被破坏或者它不是一个正确的json,那么对象的ID是nsnull,所以在创建数组时,很可能你犯了些错误,系统返回的是一个nsnull值而不是正确的nsarray,当它试图查找ValueForkey,它正在获取nsnull IsEqualToString调用

    推荐文章