5

iOS5 および XCode4.2 で開発しているアプリケーションで UIImagePickerController を使用していますが、メモリ リークが発生しています。このリークが発生する理由がわかりません。これに対する答えを教えてください。

ここに私のスクリーンショットを添付しています:

と私のコード:

-(void)createImagePicker 
{
_picker = [[UIImagePickerController alloc] init];
_picker.sourceType = UIImagePickerControllerSourceTypeCamera;

_picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;

_picker.allowsEditing = YES;
_picker.showsCameraControls = NO;


_picker.cameraDevice = UIImagePickerControllerCameraDeviceRear; 

_picker.delegate = self;
_picker.wantsFullScreenLayout = YES;

}

そしてviewWillApperメソッド:

    -(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeCameraButton:) name:@"ShowMainView" object:nil];
    [self createImagePicker];
    [m_cameraOverlayView setBackgroundColor:[UIColor clearColor]];
    [self presentModalViewController:_picker animated:NO];
    _picker.cameraOverlayView = m_cameraOverlayView;

    [cameraImgView setHidden:YES];
    [filterView setHidden:YES];
    m_cameraOverlayView.hidden = NO;
    cameraSelectedButton.hidden = NO;
    cancelButton.hidden = YES;
    selectButton.hidden = YES;

    for (id Object in [scrollview subviews])
    {
        if([Object isKindOfClass:[UIButton class]])
        {
            [Object removeFromSuperview];
        }
    }

    [m_toolbarImage setFrame:CGRectMake(0, 427, 320, 55)];
    [cameraSelectedButton setFrame:CGRectMake(128, 432, 86, 44)];

    [m_cancelButton setFrame:CGRectMake(10, 434, 82, 40)];
    [m_cancelButton setTitle:@"Close" forState:UIControlStateNormal];
    [m_cancelButton setBackgroundImage:[UIImage imageNamed:@"menu-bar-button.png"] forState:UIControlStateNormal];
    [m_cancelButton setTitleColor:[UIColor colorWithRed:110/256.0 green:52/256.0 blue:28/256.0 alpha:1.0] forState:UIControlStateNormal];


    [cancelButton setFrame:CGRectMake(120, 434, 35, 35)];
    [selectButton setFrame:CGRectMake(184, 434, 35, 35)];

    }
4

5 に答える 5

4

これは、ARC を使用しているかどうかに関係なく、iOS 5 の UIImagePickerController に問題があるようです。

xcode 3.2.5 を使用して iOS 4 用に開発されたアプリがあり、ライブラリから写真を撮ったり選択したりしても、Instruments はリークを示しません (iOS 4.1 を実行しているデバイスでテストされています)。説明されているように、iOS 5.1 を実行しているデバイスでテストされた同じコードがリークします。

これが答えではないことはわかっていますが、問題は元の質問よりも広いようです。

于 2012-05-29T22:38:29.730 に答える
3

ここにリンクされているアップルのソースコードでさえ、私たちが抱えているのと同じ問題でリークしているのを見ただけです...

于 2012-05-29T12:45:14.973 に答える
2

[_picker release];Apple Memory Management Docs で説明されているように、_picker メモリの所有権を放棄するために呼び出す必要があります。

于 2012-05-29T12:02:56.977 に答える
1

その問題に関する他の多くの投稿を読みました。これは Apple の問題だと言う人もいるので、Zillian は PhotoPicker の例もリークしていると示唆しています。回避策は、おそらくシングルトンとして UIImagePickerController のインスタンスを 1 つだけ作成し、決して解放しない (または ARC に解放させる) ことです。そうすれば、常に同じインスタンスを使用することになり、おそらくリーク回数が少なくなります。

于 2012-05-29T12:55:22.877 に答える
0

そのアプリをシミュレーターで実行していますか? もしそうなら、それは長い歴史の問題です(または戻ってくるかもしれません):

リークはほとんど (完全ではない) シミュレーターにあり、デバイスには存在しません。

http://blog.airsource.co.uk/index.php/2008/11/12/memory-usage-in-uiimagepickercontroller/

于 2012-06-02T11:15:25.013 に答える