泄漏自定义单元格

时间:2012-04-02 16:35:10

标签: ios uitableview

我在泄漏自定义单元时遇到问题。

在我重写的UITableViewController中,我有,

- (UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     TwitterTweetTableCell *cell = nil;

     // Obtain the cell...

    cell = [[TwitterTweetTableCell alloc]
            initWithTable:tableView
                andTweet:[[self getTimeline] objectAtIndex:indexPath.row]];

    return [cell autorelease];
}

在相应的重写的UITableViewCell类中,

- (TwitterTweetTableCell *) initWithTable:(UITableView *) tableView
    andTweet:(NSDictionary *) tweet
{

    tweetCell = nil;

    // ************************************************************************************
    // The identifier used in the following dequeue is the one set in the corresponding nib
    // ************************************************************************************

    tweetCell = (TwitterTweetTableCell *)
        [tableView dequeueReusableCellWithIdentifier:@"tweetCell"]; // <-- set this in NIB

    if (tweetCell)
    {
        NSLog(@"tweetCell: Reuse!");
    }

    if(!tweetCell)
    {
        NSArray *topLevelObjects = [[NSBundle mainBundle]
                loadNibNamed:@"TwitterTweetTableCell" owner:nil options:nil];

        for(id currentObject in topLevelObjects)
        {
            if([currentObject isKindOfClass:[TwitterTweetTableCell class]])
            {
                tweetCell = (TwitterTweetTableCell *)currentObject;

                break;
            }
        }

        // yadda, yadda, yadda

        [tweetCell retain];
    }

    return tweetCell;
}

自定义单元格(TwitterTweetTableCell)有相应的NIB,并且如代码中所述,单元格的标识符在那里设置为“tweetCell”。

代码工作正常,但据仪器公司说,它泄漏了细胞: - (

我相信我在使用retainCount为1返回单元格时是正确的(这是从alloc返回的,无论如何,如果我不这样,它会与僵尸一起崩溃)。如代码所示,然后我在最终将其交给表控制器之前自动释放它。

关于为何泄漏的想法将得到赞赏。

1 个答案:

答案 0 :(得分:0)

这里的问题是在cellForRowAtIndexPath:中您为自定义单元格的新实例分配内存,但在自定义单元格的初始化程序中,您实际上从未使用过您分配的内存,因为您没有返回self,而是返回一个可重复使用的现有单元格,或者从一个nib中实例化一个新单元格。

由于您的initWithTable:andTweet:方法实际上并不是初始化程序,因此您应该将其更改为返回自动释放实例的便捷方法。更改方法签名

+ (TwitterTweetTableCell *) cellWithTable:(UITableView *) tableView
andTweet:(NSDictionary *) tweet

让它自动释放其返回值,

return [tweetCell autorelease];

然后在cellForRowAtIndexPath:中对其进行稍微不同的调用,您将全部设置完毕:

return [TwitterTweetTableCell cellWithTable:tableView
                                   andTweet:[[self getTimeline] objectAtIndex:indexPath.row]];