2011-03-03 32 views
0

我想轉換現有的應用程序使用核心數據。我建立了我的實體,並使用NSFetchedResultsController在表視圖中顯示數據。目前,我只是在每次啓動應用程序時填充數據庫。奇怪布爾在tableView中的行爲(當是1不等於1?)

它似乎工作正常,除了一個奇怪的問題。我的實體有一個BOOL值,「showStarCorner」決定了星形圖像是否應該顯示在表單元格中......所以,在配置每個表格單元格時,我會調用類似於此的語句:

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或任何東西,只是按照添加日期對結果進行排序)

回答

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 
} 
+0

謝謝(對你們三個人的回答!)。這當然是問題所在,現在它工作正常。我希望不會再犯的一個菜鳥錯誤。 – 2011-03-03 03:55:44

1

僅僅因爲它們指向相同的數據,對象不能保證相等。您需要使用-isEqual:方法來測試相等,而不是==:

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

比較BOOL原語:

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

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

否則你要比較不同NSNumber對象的內存地址,這不起作用。