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 在 NSString 中搜索“整个单词”
NSPredicate 在 NSString 类型的两个日期之间进行过滤