1

uiimagepickerviewコントローラーがiPhoneでメモリリークを引き起こしている-なぜですか?

アプリケーションにUIイメージピッカービューコントローラーを実装してデバッグしてみてください。アプリケーションでメモリリークが発生します。UIイメージピッカービューコントローラーがメモリリークを作成する理由。


-(void)addPhotos:(id)sender
{
    if(imagePickerController==nil){ 
          imagePickerController=[[UIImagePickerController alloc]init];
          imagePickerController.delegate=self;
          imagePickerController.sourceType=UIImagePickerControllerSourceTypeSavedPhotosAlbum;
        imagePickerController.allowsImageEditing=YES;
          imagePickerController.navigationBar.barStyle=UIBarStyleBlackOpaque;
    }
[self.navigationController presentModalViewController:imagePickerController animated:YES];
}

ビューコントローラのdealloc。


- (void)dealloc {
if(PhotoDateArray!=nil)[PhotoDateArray release];
if(imagePickerController!=nil) [imagePickerController release];
if(objDetail!=nil) [objDetail release];
if(Picimage!=nil) [Picimage release];
if(mySavePhotoController!=nil) [mySavePhotoController release];
if(LoadingAlert!=nil);
[super dealloc];
}

メモリリークが発生する方法を説明するビデオリンク。

http://www.yourfilelink.com/get.php?fid=508534

4

4 に答える 4

2

nilチェックを行っていても、メモリがリークする可能性があります。ここで起こっていることは、alloc / initを複数回呼び出しているが、リリースは1回だけだと思います。ボタンのクリックにつながると思いaddPhoto:ますが、deallocは、デリゲートが破棄しようとしたときに1回だけ呼び出されます。これにより、次のような状況が発生します。

  • ボタンクリック
    • alloc / init
  • ボタンクリック
    • alloc / init(最初に割り当てられたピッカーのメモリリーク)
  • ウィンドウを閉じる
    • Dealloc(無料の2番目に割り当てられたピッカー)

より良い方法は、AppleがPhotoLocationsiPhoneCoreDataRecipesの例でそれを行う方法かもしれません:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];

次に、デリゲートへのメッセージdidFinishPickingImageとメッセージを聞きます。両方の場所での呼び出しで十分です。imagePickerControllerDidCancel[self dismissModalViewControllerAnimated:YES];

于 2009-09-19T15:28:43.473 に答える
1

UIImagePickerControllerPhotoLibrary.framework初めて表示されたときにロードして初期化します。このメモリは、アプリケーションが閉じられるまで再利用されません。

(投稿したコードはそのままリークしているようには見えませんが、それが原因となる方法でアプリケーションの他の部分と相互作用しないという意味ではありません)

于 2009-09-19T15:07:53.863 に答える
1

残りのコードについてはわかりませんが、リリースはありますか?

[imagePickerController release]
于 2009-09-19T01:09:18.337 に答える
1

私は同じ問題を抱えていたので、これを説明することができます。

シミュレータでメモリをテストしないでください!デバイスでアップルコードをテストすると、メモリの問題はなくなります。

Instrumentsで見つけたメモリ割り当てリークが発生していました。私が行っていたのは、イメージピッカー(開く/キャンセル)を開いたり閉じたりして、上記のようにAppleコード、自分のコード、および他の人のコードを使用することだけでした。

ピッカーが解放されていないかのように、全員が毎回割り当てが増加していることを示していました。それを解放しようとすると、クラッシュします(過剰に解放されます)。

それから私は基本的に次のように述べている本当に役立つウェブページを見つけました:

「これは、デバイスでテストする場合には発生しません」

そこで、シミュレーターから切り替えて、デバイスでテストを実行しました。見よ、割り当ての増加はなく、正常に動作しました。

しかし、これは完全に悪であり、信頼できる仕事をするためにシミュレーターに信頼を置くことはできません。

人々を救うためにこれを追加したいと思います。wtfが起こっているのではないかと思う時間、苦痛、戸惑いがあります。

于 2011-01-26T05:00:49.317 に答える