セルを追加する UITableView があります。各セルには、画像、タイトル、および AVPlayer が含まれています。私は次のように実装しています
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MyCell";
VideoFeedCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil];
cell = [topLevelObjects objectAtIndex:0];
}
NSDictionary *row = [myobj objectAtIndex:indexPath.row];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = CGRectMake(0.0, 0.0, 300.0, 300.0);
player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
[cell.myViewContainer.layer addSublayer:playerLayer];
return cell
}
私はいくつかの理由で心配しています.各セルにAVPlayerを作成すると、メモリの割り当てが消費されるようです. dequeueReusableCellWithIdentifier:CellIdentifier がどのように機能するかも明確ではありません。この途中で NSLog をスローすると、上下にスクロールするたびに呼び出されるため、AVPlayer の新しいインスタンスも作成していると思われ、これは巨大なメモリ リークのようです。基本的に、これを正しく行う方法は、UITableviewCell で使用するクラス (AVPlayer など) を割り当てますが、次に cellForRowAtIndexPath が呼び出されたときに再割り当てしないようにします。