Application crashes with EXC_BAD_ACCESS

Discussion in 'iPhone/iPad Programming' started by SimonBS, Feb 13, 2011.

  1. macrumors regular

    SimonBS

    Joined:
    Dec 30, 2009
    #1
    Hi,

    I have an application which used top bar navigation and a MapView. On the map view I have placed some annotations and when selecting an annotation, pressing the disclosure button to go into a subview and then going back to the MapView using the back button my application crashes.
    When running it in debug mode I get the message "EXC_BAD_ACCESS" in the console but I don't know why I get this error and where I should look to correct it.

    Can anyone help me figure out why my application keeps crashing?

    I have made a short video showing my crash (because I'm afraid that I do not explain it very well)

    The video can be seen on this link http://snuzzer.dk/pub/iPhoneAppMapKitCrash.mov

    Please tell me if you need to see any code in order to determine the reason for the crash. I am not sure what code would be necessary to show as I don't know where to look.

    This is the output of my stack trace but using that I still can't figure out why my application crashes.
    Code:
    #0  0x01275a63 in objc_msgSend
    #1  0x0586c860 in ??
    #2  0x0037ef1d in -[UINavigationController setDisappearingViewController:]
    #3  0x0037c4f6 in -[UINavigationController _clearLastOperation]
    #4  0x0037ce3f in -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:]
    #5  0x00509e23 in -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:]
    #6  0x0050afd2 in -[UINavigationTransitionView _cleanupTransition]
    #7  0x002f6665 in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
    #8  0x002f64f7 in -[UIViewAnimationState animationDidStop:finished:]
    #9  0x01ffa6cb in run_animation_callbacks
    #10 0x01ffa589 in CA::timer_callback
    #11 0x010f4fe3 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
    #12 0x010f6594 in __CFRunLoopDoTimer
    #13 0x01052cc9 in __CFRunLoopRun
    #14 0x01052240 in CFRunLoopRunSpecific
    #15 0x01052161 in CFRunLoopRunInMode
    #16 0x01a48268 in GSEventRunModal
    #17 0x01a4832d in GSEventRun
    #18 0x002d442e in UIApplicationMain
    #19 0x00002918 in main at main.m:14
     
  2. macrumors 6502

    Joined:
    Aug 29, 2010
    #2
    So, are you actually calling setDisappearingViewController on an instance of UINavigationController?

    Code:
    -[UINavigationController setDisappearingViewController:]
    To the best of my knowledge, that method doesn't exist. So that right there would be your problem. Post any code related to that method call.
     
  3. thread starter macrumors regular

    SimonBS

    Joined:
    Dec 30, 2009
    #3
    I just did a search for "setDisappear" in my project and I do not have that line of code anywhere in my code :(
     
  4. Moderator emeritus

    robbieduncan

    Joined:
    Jul 24, 2002
    Location:
    London
    #4
    It's almost certainly an internal method being called by the navigation controller. Normally this sort of bug is due to you releasing an object early (or failing to retain an object you should retain).
     
  5. macrumors 68030

    PhoneyDeveloper

    Joined:
    Sep 2, 2008
    #5
    A crash in objc_msgSend is due to sending a message to an object that's already been dealloced. If you run with NSZombies enabled you can usually find out what the object it.
     
  6. SimonBS, Feb 13, 2011
    Last edited: Feb 13, 2011

    thread starter macrumors regular

    SimonBS

    Joined:
    Dec 30, 2009
    #6
    Based on this information I tried to play around with my releases in MapViewController.m (as the name indicates - this file controls my MapView) and it seems that when I do not release my annotationDetailViewController (the viewController which changes the view when the disclosure button is tapped) I can't reproduce the error.

    My code looks like this:

    Code:
     - (void)mapView:(MKMapView *)aMapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
    	for(MyAnnotation* a in mapView.annotations) { // searching for chosen annotation
    		if(view.annotation == a) {
    			// set array from plist
    			NSString *path = [[NSBundle mainBundle] pathForResource:@"Annotations" ofType:@"plist"];
    			NSMutableArray* anns = [[NSMutableArray alloc] initWithContentsOfFile:path];
    
    			AnnotationDetailViewController *annotationDetailViewController = [[AnnotationDetailViewController alloc] initWithNibName:@"AnnotationDetailViewController" bundle:nil];
    			annotationDetailViewController.ann = [anns objectAtIndex:[a.annId intValue]];
    			
    			[self.navigationController pushViewController:annotationDetailViewController animated:YES];
    			[B][annotationDetailViewController release];[/B]
    			[anns release];
    		}
    	}
    }
    When I remove [annotationDetailViewController release]; it does not seem to crash. Does this sound right and if so, can anyone tell me why this could be right and when I would release it then? I will keep playing with the app to see if I can reproduce the error.

    I read about NSZombies somewhere on the internet and found out how to enable the zombies but not how to use them to find the object that might cause the error. Can you please explain this to me? I simply couldn't find the place to look.
     
  7. macrumors 68030

    PhoneyDeveloper

    Joined:
    Sep 2, 2008
    #7
    The code you show is correct WITH the release. Obviously the memory error is being hidden when you don't release the view controller. In effect you're trading a memory leak for a memory error.

    When you enable NSZombies you should then run the app. If an error occurs where the code messages a dealloced object there will be an error message printed that gives more detail about the object that's been messaged. This will help you to determine what the error is.

    Most likely the object that's being dealloced prematurely is an ivar of the view controller or is a view in the view hierarchy of that view controller.
     
  8. thread starter macrumors regular

    SimonBS

    Joined:
    Dec 30, 2009
    #8
    That's exactly what I was afraid of :(

    When NSZombieEnabled is set to 'YES' I do not get any error. The app 'just works' but no error is printed.

    I am not sure what this means :confused: Knowing that the error does not occur when annotationDetailViewController is not released, do you have an idea where the error might be?
     
  9. macrumors 68030

    PhoneyDeveloper

    Joined:
    Sep 2, 2008
    #9
    My comment on where the error might be is only a guess. Have you run build and analyze?

    Does the app get memory warnings when the view controller is covered by the map view? It's possible that your code isn't handling memory warnings correctly.
     
  10. thread starter macrumors regular

    SimonBS

    Joined:
    Dec 30, 2009
    #10
    When running Build and Analyze, I get no errors. I got some earlier today but fixed them.

    The app dos not seem to get any other memory warnings (or are there any particular tools to test this?)
     
  11. macrumors 68030

    PhoneyDeveloper

    Joined:
    Sep 2, 2008
    #11
    When your app gets a memory warning a brief message is written to the debugger console. I also have some NSLogs in the relevant methods in my view controllers and the app delegate so I can see it when it happens.

    Does the bug only happen on the device?
     
  12. thread starter macrumors regular

    SimonBS

    Joined:
    Dec 30, 2009
    #12
    It happens in the simulator. I have not tested it on the device yet as I am waiting for Apple to approve my developer license information :(
     
  13. macrumors 68030

    PhoneyDeveloper

    Joined:
    Sep 2, 2008
    #13
    OK, if you're only running on the Sim then it's not related to memory warnings.
     

Share This Page