views:

1724

answers:

4

Update:

This has been answered. It was my own stupidity, possibly not worth reading any more of this question. lol.

Question:

Right so i have this UIViewController(master) subclass, it has a UIImagepickerController(camera), it also has a UIView(overlayView). Master setups the camera to be configured as a camera only with a custom cameraOverlay, hiding the custom controls e.t.c.

All appears to work fine apart from when i try to programatically take a picture. What happens is the overlayView calls the master and this triggers the take picture, then i hear the shutter sound and the iris closes, the camera appears to dismiss itself (i am defiantly not doing this in my code) and then my viewDidAppear gets called in my master again.

Anybody have any idea whats going on ?

    -(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]; 

    }

After some help advice from people in the answers i can say that the camera is not being released.

I have also managed to stop the exec_bad_access by stopping it from calling [presentmodal....] for a second time by checking a bool value in the viewDidAppear Method.

I still have the issue where the modal view disapears, any help, again lol ??

+1  A: 

For any EXC_BAD_ACCESS errors, you are usually trying to send a message to a released object. The BEST way to track these down is use NSZombieEnabled.

This works by never actually releasing an object, but by wrapping it up as a "zombie" and setting a flag inside it that says it normally would have been released. This way, if you try to access it again, it still know what it was before you made the error, and with this little bit of information, you can usually backtrack to see what the issue was.

It especially helps in background threads when the Debugger sometimes craps out on any useful information.

VERY IMPORTANT TO NOTE however, is that you need to 100% make sure this is only in your debug code and not your distribution code. Because nothing is ever released, your app will leak and leak and leak. To remind me to do this, I put this log in my appdelegate:

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

If you need help finding the exact line, Do a Build-and-Debug (CMD-Y) instead of a Build-and-Run (CMD-R). When the app crashes, the debugger will show you exactly which line and in combination with NSZombieEnabled, you should be able to find out exactly why.

coneybeare
A: 

Check the value of the camera member variable before you try and display it:

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

I suspect it might be being released somewhere, but as coneybeare NSZombieEnabled will let you track it down.

Frank Schmitt
+1  A: 

I think you're missing a camera.delegate = self;

Kenny Winker
I hate myself. I love you. Thank god for stackoverflow.
Spyker
A: 

Hi,

I am having a problem with the use of takePicture method on an iphone. I am basically trying to take pictures using the -(void)takePicture method. However, I could not find a good tutorial that explains how to do this. I am new to the iphone app development.

Currently, what I have is a view controller which

  • creates a picker controller,
  • sets the picker controller's properties (sourcetype, toolbarhidden, etc.)
  • creates an overlay view and assigns it to the picker (picker.cameraOverlayView = overlay).
  • sets the delegate to self
  • and shows the picker with [self presentModalViewController:picker animated:NO].

On the overlayed view, I have a button. When this button is called, it is supposed to activate the camera's takePicture method. However, I am not sure how to call the picker pointer from inside the overlay view. I'd appreciate any source code examples, but pseudo-code is welcome as well.

Thanks, K.

Kahraman