2010-06-04 29 views
0

我想追加對象到我的數據源,然後重新加載表。這是接近它的正確方法嗎?這是在UITableView上重新加載數據的正確方法嗎?

self.items是我的數據源

//Copy current items 
     self.itemsCopy = [self.items mutableCopy];//[[NSMutableArray alloc] initWithArray:self.items copyItems:NO]; 

     NSLog(@"Copy Size before append: %d",[itemsCopy count]); 

     //Get new items 
     int lastMsgID = [self getLastMessageID]; 
     [self.coreData getMoreMessages:self.title lastID:lastMsgID]; //This will update self.items with 30 objects 

     //Append new items 
     [itemsCopy addObjectsFromArray:self.items]; 

     //Empty items and copy itemsCopy 
     [self.items removeAllObjects]; 
     self.items = [self.itemsCopy mutableCopy]; 

     NSLog(@"Actual Size after append: %d",[self.items count]); 

     //Reload data 
     [tableView reloadData]; 

回答

0

是的,看上去只有我的權利。

根據你的屬性聲明的方式,你可能在這裏有一些內存問題。 如果您的屬性指定保留爲屬性,則設置將數組的副本分配給它們將導致對象上的保留計數爲2,而不是預期的1.

self.myProperty = [myArray mutableCopy]; 

mutableCopy返回保留計數爲1的新分配對象。調用者擁有這個對象並負責釋放它。然後,將其分配給保留它的財產,將保留計數增加到2.由於該財產只會被釋放一次,因此在所有者被釋放時該對象將被泄漏。

解決方法是在分配並將其保留到屬性之後釋放可變副本。

self.myProperty = [myArray mutableCopy]; 
[self.myProperty release]; 

或者,您可以自動釋放mutableCopy的結果。不過,圍繞iPhone上的autorelease的使用似乎存在一些爭議。我個人認爲它沒有問題,除非它被用於在很短時間內重複許多次的緊密循環中。

self.myProperty =[[myArray mutableCopy] autorelease]; 
1

嘗試

[tableView reloadData]; 
在viewWillAppear中方法

....

0

如果您使用CoreData,那麼最好你應該使用一個NSFetchedResultsController以管理爲實現代碼如下數據。 (你確實要求「正確」的方式:-)

你會最終得到更高效的應用程序。

查看iPhoneCoreDataRecipes Sample舉一個很好的例子