2012-04-16 8 views
0

私はARCを使用するiOSアプリケーションのみを開発していますが、MPMoviePlayerControllerを使用しようとするとリークしているようですが、計測器はそのメモリを割り当てるコード行にメモリリークを投げます。ビデオプレーヤーオブジェクト、任意のアイデア?動画の再生が完了すると、動画プレーヤーのクリーンアップも行われていないようです。MPMoviePlayerControllerがリークを引き起こしています

問題の原因をアプリケーションの性質と結びつけていることを伝えることができますので、どんな助力をいただいても、この回答はどこからでも見つけられました。

コード:

@interface ViewController() 
@property(nonatomic,strong) MPMoviePlayerController * vidPlayer; 
@end 

@implementation ViewController 
@synthesize vidPlayer; 

- (void)viewDidLoad 
    { 
     @autoreleasepool { 

     [super viewDidLoad]; 
     // Do any additional setup after loading the view, typically from a nib. 
     [self playVideoForFile:@"01_intro"]; 
     } 
    } 

    -(void)playVideoForFile:(NSString*)p_fileName 
    {  
      NSString *path = [[NSBundle mainBundle] pathForResource:p_fileName ofType:@"mp4"]; 
      NSURL *tempURI = [NSURL fileURLWithPath:path]; 
      vidPlayer = [[MPMoviePlayerController alloc] initWithContentURL:tempURI]; 

     [vidPlayer setControlStyle:MPMovieControlStyleNone]; 
     [vidPlayer setAllowsAirPlay:NO]; 

     [vidPlayer.view setFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.height,[[UIScreen mainScreen] bounds].size.width)]; 


     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(vidFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:vidPlayer]; 

     [vidPlayer play]; 

     [self.view addSubview:vidPlayer.view]; 

} 

-(void)vidFinishedCallback:(NSNotification*)aNotification 
{  
      [vidPlayer pause]; 
      vidPlayer.initialPlaybackTime = -1; 
      [vidPlayer stop]; 
      vidPlayer.initialPlaybackTime = -1; 
      [vidPlayer.view removeFromSuperview]; 
      vidPlayer = nil; 

     [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:vidPlayer]; 


} 
+0

Instrumentsの結果のスクリーンショットを投稿できますか? – Squatch

答えて

1

これは勘ですが、 vidPlayerが破壊される前にremoveObserver を呼び出してみてください。ドキュメントでは、「removeObserver:removeObserver:name:object:before notificationObserverまたはaddObserver:selector:name:object:で指定されたオブジェクトを必ず解放してください」と指定する必要があります。 - NSNotification Center

また、viewDidLoadで明示的な自動解放プールを削除することもできます。 1つのビューにつきvidPlayerが1つだけで、ARCと自動リースプールで発見されたいくつかの最近の問題があった場合は、必要ありません。私は

MPMoviePlayerController *movieController = [notification object]; 
[[NSNotificationCenter defaultCenter] removeObserver:self 
    name:MPMoviePlayerPlaybackDidFinishNotification 
    object:movieController]; 
movieController = nil; 

を試してみましたが、これが動作しているようですthis bugfix

+0

オートレリースプールに関する情報をありがとう!その児童館のエラーを発見するために、しかし、運がまだ漏れを取得することはありません... http://www.welshkaratecollective.co.uk/screenshot_1.png http://www.welshkaratecollective.co.uk/screenshot_2.png –

1

私はこの問題を抱えており、グレーを送っていました!新しいビデオがインスタンス化されるたびに、(ARCを使用して)決して解放されず、viewControllerのインスタンスが作成されると、最終的にはクラッシュしたクラッシュが発生しました。 MPMoviePlayerの呼び出しをすべてチェックして、停止していてnilに設定していることを確認しました。

問題は、MPMoviePlayerControllerの割り当てと解放ではなく、ビューコントローラの詳細を渡すために使用されたデリゲートにありました。子ビューコントローラで は、私がtableViewControllerから渡されたモデルデータを確認するために、デリゲートを持っていた:

@property (strong, nonatomic) id<MyViewControllerDelegate> delegate; 

強いポインタとして割り当ては、巨大なメモリリークを引き起こしました。これを「弱い」と指定することで問題を解決しました。

@property (weak, nonatomic) id<MyViewControllerDelegate> delegate; 

一般的に、View Controllerの代理人は、それらを弱いプロパティポインタとして割り当てます。

幸運。これが漏れをなくすことを願っています!

関連する問題