这是在UITableView上重新加载数据的正确方法吗?

时间:2010-06-04 20:04:04

标签: iphone objective-c cocoa-touch arrays 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];

3 个答案:

答案 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以获取一个好例子