由于某些原因,在使用tableView cellForRowAtIndexPath方法时,我的自定义单元格被多次初始化。在我的自定义单元格中,我有一个自定义视图,可以使用AVPlayer播放AvItem。我的tableView cellForRowAtIndexPath方法看起来像这样
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell==nil) {
[tableView registerClass:[MyCustomCell class] forCellReuseIdentifier:@"cell"];
cell = [[MyCustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
}
MyCoreDataVideos *videos = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSURL * videoLocalURL = [[MyModel sharedInstance]localVideoDestinationFromVideoPath:videos.videoPath];
AVPlayerItem *item = [AVPlayerItem playerItemWithURL:videoLocalURL];
[cell.videoView.player setItem:item];
[cell.videoView.player play];
return cell;
}
我的自定义单元格的initWithStyle方法如下所示
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
NSLog(@"I'm being called a lot of times ");
_videoView = [[MyVideoPlayerView alloc]init];
_videoView.frame = self.contentView.bounds;
[self.videoView.player setShouldLoop:YES];
[self.videoView setTapActionsEnabled:YES];
self.contentView.clipsToBounds = YES;
[self.contentView addSubview:_videoView];
[self layoutSubviews];
}
return self;
}
单元初始化不止一次是正常的吗?我假设它会导致一些内存泄漏。
答案 0 :(得分:0)
两个
cell = [[MyCustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
和
cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
正在做同样的事情!
删除第一个,让UITableView
进行单元重用。它会为你调用init。
此外,在iOS 6及更高版本中,还有一个dequeueReusableCellWithReuseIdentifier: indexPath:方法,如果您提前注册了一个类/ nib,它将始终返回一个单元格。真好!