2011-10-09 86 views
0

這完全取方法的工作和NSLog的打印出數據庫中的內容...(在一個NSArray fetchedObjects):iphone:核心數據:NSManagedObjects和UITableView的崩潰

NSError *error2; 
fetchedObjects = [moc executeFetchRequest:fetchRequest error:&error2]; 

if (!fetchedObjects) { 
    NSLog(@"Error %@",[error2 localizedDescription]); 
} 

for (NSManagedObject *info in fetchedObjects) { 

    NSLog(@"Name: %@", [info valueForKey:@"Name"]); 
    NSLog(@"Description: %@", [info valueForKey:@"Description"]); 
    NSLog(@"Ingredients: %@", [info valueForKey:@"Ingredients"]); 

..但是當我嘗試填充tableView(我已經建立了很多表並感覺我對它們的工作原理有了很好的理解),程序崩潰時出現了「int retVal = UIApplicationMain(argc,argv,nil,nil)的EXE_BAD_ACCESS ;.」就是這樣,沒有其他錯誤信息。我試圖調試,我把這個簡單的NSLog放在「cellForRowAtIndexPath」方法中,但它在NSLog(@「fetchedObjects count = tableview%i」,[fetchedObjects count])時崩潰。

據我所知,我還沒有發佈陣列。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    // Configure the cell. 
    NSLog(@"fetchedObjects count in tableview %i",[fetchedObjects count]); 
    NSManagedObject *info3 = [fetchedObjects objectAtIndex:indexPath.row]; 
    NSLog(@"Name: %@", [info3 valueForKey:@"Name"]); 
    cell.textLabel.text = [info3 valueForKey:@"Name"]; 
+0

numberOfRowsInSection中的行數是多少?在哪個方法中你正在初始化fetchedObjects? –

+0

嗨Praveen。我使用'return [ArrayNameHere count];'目前它是27.這意味着數組在那裏......!?! – Jeremy

回答

1

看起來像你的fetchedObjects實例變量由於autorelease池刷新而被釋放。

NSManagedObjectContext-executeFetchRequest:error:方法返回自動釋放NSArray實例,該實例你沒有獲得的所有權,因此由時間執行到達-tableView:cellForRowAtIndexPath:方法,所述自動釋放池被刷新,而該對象被釋放,你現在有一個懸掛指針。啊,經典。

當然,解決方案是發送-retain消息到返回的NSArray從發送-executeFetchRequest:error:到您的NSManagedObjectContext

不要忘記在您的-dealloc方法中發送-release消息。

+0

謝謝雅各布。我將fetchObjects複製到另一個數組中:'displayArray = [NSArray arrayWithArray:fetchedObjects];'並打印出內容(一切正常)。我在調用表reloaddata [displayArray count]之前檢查這個數組,這個工作非常棒。改變tableView指向這個新的數組,它仍然崩潰在NSLog的NSLog(@「displayArray計數在tableview%我」,[displayArray計數]);'我甚至手動創建另一個數組,並指出tableView在那個確定表正在工作(而且是)。爲了以防萬一,我還多次清理了這個項目。 – Jeremy

+0

終於搞定了。我應該將'fetchedObjects'複製到一個新的數組中,所以:'displayArray = [fetchedObjects mutableCopy];'似乎正在使用'[NSArray arrayWithArray:fetchedObjects]'複製數組''不正確。謝謝你的幫助。 – Jeremy

+0

@Jeremy創建副本比調用'-retain'更貴。你應該真正做我告訴你的,不要複製。這是不必要的開銷。 –

0

這個問題似乎是在這條線

NSManagedObject * INFO3 = [fetchedObjects objectAtIndex:indexPath.row];

嘗試使用

NSManagedObject * INFO3 = [fetchedObjects objectAtIndex:0];

因爲您的UiTableViewCell計數和fetchedObjects計數在整個過程中應該是相等的。

如果它不匹配,那麼它會給你索引錯誤。