2010-10-14 44 views
1

由於運行時發送isEqualToString:到一個NSNull對象,我的程序崩潰。我找不到這個NSNull來自哪裏;我從不明確創建一個。我也無法找到誰或什麼叫isEqualToString。[NSNull isEqualToString]

我的理解是,NSNull是一個反對意見,只是爲了解決你無法將nil添加到集合的事實。我的程序確實創建了幾個自動釋放陣列;所以我猜測其中的一個以某種方式結束了NSNull。奇怪的是,這些數組都不應該包含任何NSString對象,這意味着isEqualToString:如果它發送到我的數組中的對象,會導致崩潰。

我創造這些陣列與CoreData獲取請求,並斷言:

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]; 

後來我進一步篩選這樣的fetchedResults:

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:消息實際發送的位置? (如果我正在逐步完成,它發生在我的所有代碼執行完畢後,我的猜測是某個地方正在進行自動發佈)。

謝謝!

回答

1

經過近2整天沒有做什麼,但嘗試找出這次崩潰,我發現它。

原來,它與我的陣列沒有任何關係!我有一個被觀察的物體,觀察者在觀察物體被處理之前並沒有停止觀察。我不知道的是,當一個觀察對象得到處理時,它會通知它的觀察者它的值正在更新。具體來說,他們正在更新到NSNull。

所以我的Client.name屬性被更新爲NSNull,它提醒我的觀察者它正在被更改。在我的observeValueForKeyPath:方法中,我試圖將UILabel的文本更新爲新的客戶端名稱,這導致了崩潰。

真正令人討厭的是,我已經不得不跳過一大堆箍,以確保當我的觀察者得到處理時,它停止觀察它正在觀察的任何事物。現在我不得不進入並做一些更花哨的事情,以確保在我的客戶得到處理之前,觀察它的任何事物都會停止觀察。非常痛苦。

但它是固定的!

0

我不習慣使用CoreData獲取請求,但是當我解析一個JSON時,如果對象被破壞或者它不是一個合適的JSON,對象的ID是NSNULL,所以可能你做錯了什麼時候創建數組和系統返回你一個NSNull值而不是一個正確的NSArray,並且當它試圖尋找valueForKey時,它得到的NSNull isEqualToString調用

+0

我剛剛刪除了我現有的所有數據,並開始使用2個測試條目進行更新;我仍然有同樣的問題。所以它似乎不涉及任何特定的數據。 – GendoIkari 2010-10-14 15:13:25