【问题标题】:[viewcontroller retain]: message sent to deallocated instance error after dismiss viewcontroller[视图控制器保留]:关闭视图控制器后发送到已释放实例错误的消息
【发布时间】:2018-06-26 09:49:49
【问题描述】:

我的应用程序在 collectionview 中选择项目后呈现 viewcontroller(detailsview):

[self presentViewController:detailView animated:YES completion:^{


                }];

从新的 viewcontroller 启动 avplayer 之后,我将关闭播放器,然后是(detailsview)viewcontroller 并返回主视图控制器。这里应用程序崩溃并给出错误 [detailsviewController retain]: message sent to deallocated instance。这是我在苹果电视上做的。使用菜单操作关闭控制器。

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{ 

 if([assetType isEqualToString:@“MOV”] ||[assetType isEqualToString:@"PRG”] )
            {
                    // Asset landing page

                    NSMutableArray *assets=[[NSMutableArray alloc]initWithObjects:@"ViewAll",nil];
                    [assets addObjectsFromArray:self->allAssetsArray];
                    NSDictionary *SelectedAsset=[self->allAssetsArray objectAtIndex:indexPath.row];
                    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

                    DetailsViewController  *detailView =(DetailsViewController*)[storyboard instantiateViewControllerWithIdentifier:@"DetailsViewController"];

                    OnDemandAssetModel * assetModel=[[OnDemandAssetModel alloc]init];
                    assetModel.identifier=[SelectedAsset objectForKey:@"id"];
                    assetModel.assetCategory=@"";//[category objectForKey:@"name"];
                    assetModel.assetId=[SelectedAsset objectForKey:@"assetId"];
                    assetModel.assetName=[SelectedAsset objectForKey:@"movieName"];
                    assetModel.assetDuration=[SelectedAsset objectForKey:@"runningTime"];
                    assetModel.assetGenre=[SelectedAsset objectForKey:@"genre"];
                    assetModel.assetCategoryType=@"SVoD";
                    assetModel.assetDirector=[SelectedAsset objectForKey:@"director"];
                    assetModel.assetActors=[SelectedAsset objectForKey:@"cast"];
                    assetModel.assetCC=[SelectedAsset objectForKey:@""];

                    assetModel.assetAvailableUntil=[SelectedAsset objectForKey:@"availableUntil"];
                    assetModel.assetRating=[SelectedAsset objectForKey:@"rating"];
                    assetModel.assetPosterPath=[SelectedAsset objectForKey:@"movieImage"];
                    assetModel.assetContentType=[SelectedAsset objectForKey:@"movieType"];
                    assetModel.assetDescription=[SelectedAsset objectForKey:@"description"];
                    assetModel.assetReleasedYear=[SelectedAsset objectForKey:@"releasedYear"];
                    assetModel.subscriptionStatus=[SelectedAsset objectForKey:@"subscription"];

                    detailView.assetModel=assetModel;
                    detailView.selectedAssetID=assetModel.assetId;
                    detailView.selectedIndex=[NSIndexPath indexPathForRow:indexPath.row+1 inSection:0];
                    detailView.identifier=assetModel.identifier;

                    [self showViewController:detailView sender:nil];

                  //  [self presentViewController:detailView animated:YES completion:^{


                   // }];
            }


}

【问题讨论】:

  • 显示代码在哪里添加 viewcontroller 和 avplayer
  • 如果您使用ARC,应用程序会崩溃或报错。
  • 是的,我正在使用 ARC。
  • 嗨 piotri 我添加了代码,请检查一次。
  • 嗨,Mahboob,我怎样才能摆脱这个问题。

标签: objective-c uiviewcontroller uicollectionview apple-tv avplayerviewcontroller


【解决方案1】:

您可以通过将 detailView 保存到实例变量来处理崩溃。现在它只是一个局部变量,所以当它不再使用时它会被释放。

@property (strong, nonatomic) DetailsViewController *detailsView; 添加到您的@interface,并在您发布的代码中将 detailsView 上的 alloc 更改为:

self.detailView = (DetailsViewController*)[storyboard instantiateViewControllerWithIdentifier:@"DetailsViewController"];

【讨论】:

  • 我这样做对我没有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多