真的只是一个简单的问题:
我正在运行一种方法将记录从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
我的问题有两个:
*model
对象,但这肯定会导致泄漏?干杯。
答案 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
}