我正在尝试将对象附加到我的数据源,然后重新加载表。这是接近它的正确方法吗?
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 :(得分:1)
尝试
[tableView reloadData];
在viewWillAppear方法中的....
答案 1 :(得分:0)
是的,看起来对我来说是正确的。
根据您的属性声明方式,您可能会遇到一些内存问题。 如果您的属性指定retain作为属性,那么设置为它们分配数组的副本将导致对象的保留计数为2而不是预期的1。
例如
self.myProperty = [myArray mutableCopy];
mutableCopy返回一个保留计数为1的新分配对象。调用者拥有此对象并负责释放它。然后将它分配给保留它的属性,将保留计数增加到2.当释放所有者时,对象将被泄露,因为该属性只会被释放一次。
解决方案是在将可变副本分配并保留到属性之后释放它。
self.myProperty = [myArray mutableCopy];
[self.myProperty release];
或者你可以自动释放mutableCopy的结果。然而,围绕在iPhone上使用自动释放似乎存在一些争议。我个人没有看到它的问题,除非它用于在短时间内多次迭代的紧密循环中。
self.myProperty =[[myArray mutableCopy] autorelease];
答案 2 :(得分:0)
如果您正在使用CoreData,那么理想情况下您应该使用NSFetchedResultsController来管理tableview的数据。 (你确实要求“正确”的方式:-)
你最终会得到一个更节省内存的应用程序。
请参阅iPhoneCoreDataRecipes Sample以获取一个好例子