更新:
已经回答了这个问题。这是我自己的愚蠢,可能不值得再读这个问题了。洛尔。
问题:
对,所以我有这个UIViewController(主)子类,它有一个UIImagepickerController(摄像头),它还有一个UIView(overlayView)。 Master将相机配置为仅使用自定义cameraOverlay配置为相机,隐藏自定义控件e.t.c.
除了我尝试以编程方式拍照时,所有内容似乎都能正常工作。接下来发生的事情是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方法中的bool值来阻止exec_bad_access第二次调用[presentmodal ....]。
我仍有问题,模态视图消失,任何帮助,再次大声笑??
答案 0 :(得分:2)
我认为你错过了camera.delegate = self;
答案 1 :(得分:1)
对于任何EXC_BAD_ACCESS错误,您通常会尝试向已发布的对象发送消息。跟踪这些内容的 BEST 方式是使用NSZombieEnabled。
这可以通过永远不会实际释放一个对象,但将其包装为“僵尸”并在其中设置一个标志,表示它通常会被释放。这样,如果您再次尝试访问它,它仍然知道在发生错误之前它是什么,并且通过这些信息,您通常可以回溯以查看问题所在。
当调试器有时会抓取任何有用的信息时,它特别有助于后台线程。
非常重要注意但是,您需要100%确保这只是在您的调试代码而不是您的分发代码中。因为什么都没有发布,你的应用程序将泄漏,泄漏和泄漏。为了提醒我这样做,我把这个日志放在我的appdelegate:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
如果您需要帮助查找确切的行,请执行构建和调试(CMD-Y)而不是构建并运行(CMD-R)。当应用程序崩溃时,调试器会向您显示确切的行,并与NSZombieEnabled结合使用,您应该能够确切地找到原因。
答案 2 :(得分:0)
在尝试显示之前检查camera
成员变量的值:
NSLog(@"going to show camera: %@", camera);
我怀疑它可能会被释放到某个地方,但是因为它可以让你跟踪NSZombieEnabled。