4

で を使用しUIImagePickerていますviewController

非常に有名な「wait_fences: failed to receive reply: 10004003」と同様に、常にメモリ警告が表示される 2 種類の方法があります。

しかし、警告を表示する特定のコード行をたどることはできません。これらのメソッドの直後に、デバッグできない場所に常に表示されます。

// in myViewController.h

// the first 2 are the methods that I alloc my UIImagePicker,
// here, self.photoPicker is a retained property of UIImagePicker.
- (IBAction)fromAlbumButtonTapped {
    if (self.photoPicker == nil) {
        self.photoPicker = [[[UIImagePickerController alloc] init] autorelease];
        self.photoPicker.delegate = self;
    }
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
        self.photoPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        [self presentModalViewController:self.photoPicker animated:YES];
        return;
    }
}

- (IBAction)fromCameraButtonTapped {
    if (self.photoPicker == nil) {
        self.photoPicker = [[[UIImagePickerController alloc] init] autorelease];
        self.photoPicker.delegate = self;
    }
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        self.photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        [self presentModalViewController:self.photoPicker animated:YES];
        return;
    }
}
// and this is another part that gives me the memory warning - getting a photo.
- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info {
    self._photo = [info objectForKey:UIImagePickerControllerOriginalImage];
    self.photoView.photoView.image = self._photo;
    [self.photoButton setImage:self._photo forState:UIControlStateNormal];
    [self dismissModalViewControllerAnimated: YES];
}

既にコードをチェックしましたが、メモリ リークの可能性はありませんでした。

写真の処理にはある程度のメモリが必要であることを知っているので、メモリ警告が表示されるのは正常です。

しかし、問題は時々、ナビゲーションスタックのparentViewコントローラーに戻るためのボタンなど、警告が表示されたときに重要なことですviewControllerrelease

そのため、ボタンやその他の重要なものがリリースされるのが早すぎる場合に、メモリ警告を受け取りたくありません。

それを修正する方法はありますか?

4

3 に答える 3

2

すべてのメモリ「損失」がリークによって引き起こされるわけではありません。ヒープショットを使用します。

計測器を使用して、保持されているがリークされていないメモリによるリークとメモリ損失をチェックします。後者は、まだポイントされている未使用のメモリです。Instruments の Allocations Instrument で Heapshot を使用します。

Heapshot を使用してメモリ クリープを検出する方法については、bbum ブログを参照してください。

基本的には、Instruments 割り当てツールを実行し、ヒープショットを取得し、コードの直感を実行して、別のヒープショットを 3 ~ 4 回繰り返す方法があります。これは、反復中に割り当てられ、解放されないメモリを示します。

結果を把握するには、個々の割り当てを確認してください。

オブジェクトの保持、解放、および自動解放が発生する場所を確認する必要がある場合は、インストゥルメントを使用します。

計測器で実行し、割り当てで「参照カウントの記録」をオンに設定します (オプションを設定するには、記録を停止する必要があります)。ピッカーを実行し、記録を停止し、そこで ivar (datePickerView) を検索し、ドリルダウンすると、すべての保持、解放、および自動解放が発生した場所を確認できます。

于 2012-02-29T13:11:24.967 に答える
0

UIImagePickerController を使用すると、写真が取得されます。写真はかなり大きいかもしれません。たとえば、8MP オンボード カメラの場合、各ピクセルは RGB であるため、実際には 8MP * 3 バイトであり、パックされていない場合は 8MP * 4 = 32MB になります。したがって、メモリの警告が表示されても不思議ではありません。

didReceiveMemoryWarning をオーバーライドし、メモリをクリアします。また、ビューはアンロードされる場合があるため (iOS 6 より前)、viewWillLoad でビューを適切に再ロードできる必要があります。メモリ管理を参照してください

于 2012-10-17T01:28:35.087 に答える
0

以下を変更

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[imageView setImage:image];
[self dismissModalViewControllerAnimated:YES];
}

以下に...

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[self dismissModalViewControllerAnimated:YES];
[imageView setImage:image];
}
于 2013-08-06T13:37:33.323 に答える