如何在函数中返回新的已分配对象?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"liteCell"];
[cell.textLabel setText:@"Lite"];
return cell; // Object returned to caller as an owning reference (single retain count transferred to caller)
}
对象泄露:从名称('tableView:cellForRowAtIndexPath:')不以'copy','mutableCopy','alloc'或'new'开头的方法返回分配并存储到'cell'中的对象。这违反了“Cocoa内存管理指南”中给出的命名约定规则
答案 0 :(得分:1)
在这种情况下你应该返回一个自动释放的对象,所以解决方案是
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault] autorelease];
哦,更好的方法是使用[tableView dequeueReusableCellWithIdentifier:CellIdentifier]
,如下所示:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (nil == cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
return cell;
}
答案 1 :(得分:0)
对于iOS 5,您需要检查已经实例化的单元格,如果不是,则需要实例化单元格:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (nil == cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
return cell;
}
在iOS 6+下,您只需要为表格视图注册所需的单元格:
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];
然后你可以使用:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
并将始终收到已分配的单元格,以便您可以编写
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
return cell;
}