1

更新:

这已经回答了。这是我自己的愚蠢,可能不值得再读这个问题了。哈哈。

问题:

对,所以我有这个 UIViewController(master) 子类,它有一个 UIImagepickerController(camera),它还有一个 UIView(overlayView)。Master将相机设置为仅具有自定义cameraOverlay的相机,隐藏自定义控件等

除了我尝试以编程方式拍照之外,一切似乎都很好。发生的情况是overlayView调用主控并触发拍照,然后我听到快门声音并且光圈关闭,相机似乎自行关闭(我在我的代码中坚决不这样做)然后我的viewDidAppear被调用又是我的主人。

有人知道发生了什么吗?

    -(void)viewDidLoad
{
    NSLog(@"loading the view");
    //if the camera is on the device
    if ( [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    {
        //make one
        camera = [[UIImagePickerController alloc] init];
        //setup some settings that we need
        camera.sourceType = UIImagePickerControllerSourceTypeCamera;
        camera.showsCameraControls = NO;
        camera.navigationBarHidden = NO;
        camera.toolbarHidden = YES;
        camera.cameraViewTransform = CGAffineTransformScale(camera.cameraViewTransform, 1.03, 1.03);
        //show it
        overlayView = [[OverlayView alloc] initWithFrame:CGRectMake(0,0,320,480) withDelegate:self andController:self];
        camera.cameraOverlayView = overlayView;
            camerashowing=NO;

    }
    else 
    {
        alert = [[UIAlertView alloc] initWithTitle:@"No Camera Detected" message:@"The camera is broken or your device has no camera. Please close the application" delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
        [alert show];
        [alert release];
    }
}

-(void)viewDidAppear:(BOOL)animated
{
  if (!cameraShowing)
  {
    NSLog(@"going to show camera");
    [self presentModalViewController:camera animated:NO];
    camerashowing = YES;
  }
}



 -(void)releaseShutter
  { 
    [overlayView toolbarShowWarning];
    NSLog(@"going to show camera: %@", self);
    [camera takePicture]; 

    }

在得到人们的一些帮助建议后,我可以说相机没有被释放。

我还设法通过检查 viewDidAppear 方法中的布尔值来阻止 exec_bad_access 第二次调用 [presentmodal....]。

我仍然有模态视图消失的问题,任何帮助,再次大声笑?

4

3 回答 3

2

我认为你缺少一个camera.delegate = self;

于 2009-11-10T22:49:41.377 回答
1

对于任何 EXC_BAD_ACCESS 错误,您通常会尝试向已释放对象发送消息。追踪这些的最佳方法是使用NSZombieEnabled

这是通过从不实际释放对象来实现的,而是将其包装为“僵尸”并在其中设置一个标志,表明它通常会被释放。这样,如果您再次尝试访问它,它仍然会在您出错之前知道它是什么,并且通过这一点信息,您通常可以回溯以查看问题所在。

当调试器有时会发现任何有用的信息时,它尤其有助于后台线程。

但是非常重要的是,您需要 100% 确保这仅在您的调试代码中,而不是在您的分发代码中。因为什么都没有发布,所以你的应用程序会泄漏、泄漏和泄漏。为了提醒我这样做,我把这个日志放在我的 appdelegate 中:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

如果您需要帮助找到确切的行,请执行构建和调试 (CMD-Y) 而不是构建和运行 (CMD-R)。当应用程序崩溃时,调试器将准确显示哪一行,并结合 NSZombieEnabled,您应该能够准确找出原因。

于 2009-11-10T22:27:37.037 回答
0

camera在尝试显示之前检查成员变量的值:

NSLog(@"going to show camera: %@", camera);

我怀疑它可能会在某个地方发布,但由于 coneybeare NSZombieEnabled 会让你追踪它。

于 2009-11-10T22:31:45.347 回答