2

セルを追加する 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 が呼び出されたときに再割り当てしないようにします。

4

2 に答える 2

1

if (cell == nil)ブロック内に割り当てコードを配置する必要があります。したがって、コードを取得して、これを試してください:

- (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];
        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];
    }
    NSDictionary *row = [myobj  objectAtIndex:indexPath.row];
    return cell
}
于 2013-02-19T07:26:46.583 に答える
0

不要なインスタンスを削除できます:

-(void)prepareForReuse{
    [super prepareForReuse];
    [playerLayer removeFromSuperlayer];
    playerLayer = nil;
    playerItem = nil;
    asset = nil;
    player = nil;
}
于 2015-09-15T19:22:10.880 に答える