tableviewDataSource中的内存管理

时间:2011-02-22 22:09:37

标签: iphone ios memory-management tableview

真的只是一个简单的问题:

我正在运行一种方法将记录从sqlite数据库拉入数组,然后将该数组的内容分配给实例变量。

@interface {
NSArray *items;
}

@implementation
// The population method.
-(void)populateInstanceVariable
{
    NSMutableArray *itemsFromDatabase = [[NSMutableArray alloc] init];        

    // Sqlite code here, instantiating a model class, assigning values to the instance variables, and adding this to the itemsFromDatabase Array.


    self.items = itemsFromDatabase;
    [itemsFromDatabase release];

}
// viewDidLoad is calling the method above
-(void)viewDidLoad
{
    [self populateInstanceVariable];
    [super viewDidLoad];
}

// TableViewDataSource method - cellforIndexPath
- (UITableViewCell *)tableView:(UITableView *)passedInTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault];

    // Load in my model from the instance variable - ***1
    MyDataModel *model = [items objectAtIndexPath:indexPath.row];

    // Assign the title to the cell from the model data
    cell.textLabel.text = model.title;

    // This is the part i'm stuck on, releasing here causes a crash!
    [model release];

    return cell;

}

@end

我的问题有两个:

  1. 我正在做的是将数据分配给实例变量吗?我正在管理记忆吗?
  2. 如何在tableview数据源中管理该模型项的内存?我似乎能够让它顺利运行的唯一方法是,如果我根本不释放*model对象,但这肯定会导致泄漏?
  3. 干杯。

2 个答案:

答案 0 :(得分:2)

不,你在这里没有正确管理记忆:

  • 你应该使用“可重用的”UITableViewCells,大多数UITableView示例都说明了如何做到这一点,

  • 不做[模型发布],在这种情况下你没有“拥有”这个对象,你只是指它,所以你不能发布它

这是典型的cellForRowAtIndexPath:

-(UITableViewCell *) tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"CellIdentifier";

    // Dequeue or create a cell of the appropriate type.
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
        // settings that do not change with every row
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    // settings that change with every row
    cell.textLabel.text = @"fill in your label here";
    return cell;
}

此外,如果您使用数据库作为数据,您可能需要查看Core数据,Apple的数据持久性/管理框架,它包括将数据实体的各个方面直接挂接到UITableViews的能力。 / p>

答案 1 :(得分:0)

1)填充方法是正确的。不要忘记在dealloc中将实例变量设置为nil。 (我想你在使用'self。'时添加了一个属性/合成。)。

2)不要释放模型对象。您没有在该方法中保留,复制或分配它。另一方面,您对单元格的初始化是错误的。使用以下内容:(更好的表现)

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   static NSString *Identifier = @"CellIdentifier";

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];
   if (cell == nil) {
      cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:Identifier] autorelease];
   }

   //Other code
}