tableView中的奇怪BOOL行为(当1不等于1?)时

时间:2011-03-03 03:25:39

标签: ios objective-c core-data

我正在尝试将现有应用转换为使用核心数据。我已经设置了我的实体,并使用NSFetchedResultsController在表视图中显示数据。现在,我只是在每次启动应用程序时填充数据库。

除了一个奇怪的问题外,似乎工作正常。我的实体有一个BOOL值,“showStarCorner”,用于确定是否应在表格单元格中显示星形图像...所以,在配置每个tableview单元格时,我调用类似于if语句的内容:

if (myObject.showStarCorner == [NSNumber numberWithBool:YES]) {
    // show the star corner
}

但令人惊讶的是,只有在应用程序启动时创建的对象上才会显示星标。 (应用程序的先前启动时添加的应该显示星标的对象不是)

我添加了一个额外的测试,以帮助弄清楚出了什么问题:

if (myObject.showStarCorner == [NSNumber numberWithBool:YES]) {
    NSLog(@"%@ == %@", myObject.showStarCorner, [NSNumber numberWithBool:YES]);
}
else if (myObject.showStarCorner != [NSNumber numberWithBool:YES]) {
    NSLog(@"%@ != %@", myObject.showStarCorner, [NSNumber numberWithBool:YES]);
}

...这会导致为先前添加的对象调用else语句:

1 != 1

据我所知,1应该总是等于1 ......所以我完全不知所措。

我非常感谢任何帮助。它是否与每个应用程序启动时创建的具有相同属性的新对象有关? (我没有分配任何唯一的ID或任何东西,只是按照添加日期对结果进行排序)

3 个答案:

答案 0 :(得分:2)

NSNumber*变量是指针,指针上的==检查指针是否相等。由于您的对象不共享相同的内存位置(因为它们是由对[NSNumber numberWithBool:]的不同调用创建的),因此它们不被视为指针相等(因此比较返回NO)。

请改用isEqual:方法,该方法应检查值是否相等,是否适用于大多数类,或者从boolValue个对象中获取NSNumber并进行比较。

if (myObject.showStarCorner.boolValue == YES) {
    // show the star corner
}

if ([myObject.showStarCorner isEqual:[NSNumber numberWithBool:YES]]) {
    // show the star corner
}

答案 1 :(得分:1)

对象,仅仅因为它们指向相同的数据,并不保证是相同的。您需要使用-isEqual:方法来测试相等性,而不是==:

if ([myObject.showStarCorner isEqual: [NSNumber numberWithBool: YES]) {
    //show the star corner
}

答案 2 :(得分:1)

比较BOOL原语:

if ([myObject.showStarCorner boolValue] == YES) {

// Alternatively,
if ([myObject.showStarCorner boolValue]) {

否则,您正在尝试比较不同NSNumber个对象的内存地址,这些内容不起作用。