如何在Objective-C函数中返回新的已分配对象?

时间:2013-04-06 19:14:15

标签: objective-c memory-management

如何在函数中返回新的已分配对象?

- (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内存管理指南”中给出的命名约定规则

2 个答案:

答案 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;
}