我在泄漏自定义单元时遇到问题。
在我重写的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返回的,无论如何,如果我不这样,它会与僵尸一起崩溃)。如代码所示,然后我在最终将其交给表控制器之前自动释放它。
关于为何泄漏的想法将得到赞赏。
答案 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]];