【问题标题】:iPhone crash randomly when calling a camera?调用相机时iPhone随机崩溃?
【发布时间】:2012-07-12 15:11:40
【问题描述】:

我已经使用仪器测试了我的应用程序,它显示了以下泄漏。

当我双击堆栈跟踪中的 CameraVC 时,它会在我的代码中引用以下行。

当我调用相机时会发生这种情况,我使用以下代码调用它:-

      - (IBAction) getCamera
{
    // set up our camera overlay view   
    // tool bar - handy if you want to be able to exit from the image picker...
    UIToolbar *toolBar=[[UIToolbar alloc] initWithFrame:CGRectMake(0, 480-44, 320, 44)];

    UIBarButtonItem *spaceItem  = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace  target:nil action:nil] autorelease];
    UIBarButtonItem *spaceItem1  = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace  target:nil action:nil] autorelease];
    UIBarButtonItem *cancelItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel  target:self action:@selector(cancelPickingImag)] autorelease];
    UIBarButtonItem *cameraItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera  target:self action:@selector(finishedAugmentedReality)] autorelease]; 

    spaceItem.width  = 2.0;
    spaceItem1.width = 55.0;
    NSArray *items=[NSArray arrayWithObjects:spaceItem,cancelItem,spaceItem1,cameraItem,nil];
    [toolBar setItems:items];

    // create the overlay view
    overlayView=[[OverlayView alloc] initWithFrame:CGRectMake(0, 300, 320, 480-44)];

    // important - it needs to be transparent so the camera preview shows through!
    overlayView.opaque=NO;
    overlayView.backgroundColor=[UIColor clearColor];

    // parent view for our overlay
    UIView *parentView=[[UIView alloc] initWithFrame:CGRectMake(0,0,320, 480)];
    [parentView addSubview:overlayView];
    [parentView addSubview:toolBar];
    [parentView addSubview:lbl];
    [parentView addSubview:overlayGraphicView];

    // configure the image picker with our overlay view
    //UIImagePickerController *picker=[[UIImagePickerController alloc] init];

    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeCamera])
    {
        imagePicker = [[UIImagePickerController alloc] init];
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

        // hide the camera controls
        imagePicker.showsCameraControls=NO;

        imagePicker.delegate = self;
        //imagePicker.allowsImageEditing = NO;

        // and put our overlay view in
        imagePicker.cameraOverlayView=parentView;
    }
    else
    {
        imagePicker = [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        imagePicker.mediaTypes = [NSArray arrayWithObjects:
                                  (NSString *) kUTTypeImage,
                                  nil];
        imagePicker.allowsEditing = NO;

    }

    [self presentModalViewController:imagePicker animated:YES];

    //Free memory 
    [imagePicker release];//,imagePicker =nil;
    [parentView release], parentView=nil;
    [overlayGraphicView release], overlayGraphicView= nil;
    [lbl release], lbl=nil;
    [overlayView release];//, overlayView =nil;
    [toolBar release], toolBar=nil;
}

非常感谢任何帮助

谢谢

【问题讨论】:

  • @DustinRowland,谢谢回复,我在函数结束时放出来。
  • 我不释放它,因为我不使用init或alloc。
  • arrayWithObjects 是一个方便的方法,它实际上是[NSArray alloc] initWithObjects:]
  • @DustinRowland,当我发布它并使用分析构建系统时,它可能会泄漏。
  • 尝试使用僵尸并观察变量的保留计数

标签: ios objective-c memory-management crash


【解决方案1】:

parentView 是用[alloc [init...]] 创建的,这意味着它是retained。然后将其分配给imagePickercameraOverlayView 属性,这意味着它再次获得retained。完成该任务后,您需要release它。

(这几乎可以肯定是“泄漏”的原因,但不会导致“崩溃”。您说您遇到了崩溃,但根本没有描述。)

【讨论】:

  • 看起来他被僵尸撞倒了。
  • @Hot Licks,感谢您的回复,在我访问相机后发生崩溃,实际上在我拍摄 6 张照片后发生崩溃。释放parentView不能解决问题。
  • @Khattab -- 这里有几个很好的提示。表现出一些主动性。
  • 感谢所有帮助我解决这个问题的提示,谢谢大家
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多