NSPredicate 与 NSString 发生奇怪的崩溃

Posted

技术标签:

【中文标题】NSPredicate 与 NSString 发生奇怪的崩溃【英文标题】:NSPredicate weird crash with NSString 【发布时间】:2014-04-28 19:08:49 【问题描述】:

我正在尝试根据她的名字获取 CoreData 实体,为此创建了一个方法,该方法接受名称参数(NSString),所以这是方法:

-(void)pegarCategoryByName:(NSString *)catName 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
    NSLog(@"Category Name: %@", catName);
    NSError *error = nil;

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Categorias" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"categoria == '%@'", catName];
    [fetchRequest setPredicate:predicate];
   // [fetchRequest setFetchLimit:1];

    NSArray *fetchedObjects = [[self managedObjectContext]executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects.count > 0) 

        _categoriaAtual = [fetchedObjects objectAtIndex:0];

     else 
        NSLog(@"Category not Found");
    



假设我在代码中的某个地方调用:

[self pegarCategoryByName:@"Songs"];

当我运行时,我得到 NSLog: Category Name Songs, Category not Found 并且应用程序崩溃了。

奇怪的是,如果我将 pegarCategoryName 上的 NSPredicate 更改为不使用传递的 NSString,下面是示例:

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"categoria == 'Songs'"];

一切正常。

【问题讨论】:

【参考方案1】:

不要用引号将谓词格式中的%@ 占位符括起来:

[NSPredicate predicateWithFormat:@"categoria == %@", catName];

【讨论】:

我现在真的很愚蠢,我已经为此苦苦挣扎了至少 30 分钟,但我从来没有想过要这样做。感谢您的回答! @André 如果答案解决了您的问题,请不要忘记点击旁边的复选标记来接受答案:)【参考方案2】:

catName 已经是一个字符串;您不需要用引号将其括起来,它与以下内容相同:

categoria == '@"Songs"'

所以删除它们:

@"categoria == %@"

【讨论】:

以上是关于NSPredicate 与 NSString 发生奇怪的崩溃的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 正则表达式错误

通过 NSPredicate 在 NSString 中搜索“整个单词”

NSPredicate 中 NSString 的问题

NSPredicate 在 NSString 类型的两个日期之间进行过滤

ios 如何正确使用 NSPredicate 来匹配 Core Data 的 NSString?

NSPredicate 与正则表达式检查字母数字