I have a signup method that hits an API to sign up a user and return the account information. Everything works fine, but in my signup viewcontroller, when signup is successful, I pop the signup view. Once I pop the signup view, I get EXC_BAD_ACCESS on the line below. NOTE - this only happens on the phone. In the simulator this does not happen. It seems to be a timing issue somehow, but I cant figure it out. For example, if I put a breakpointer on [_completionHandlerSignUp release]; then it works every time.
Here is my createAccount method in my DataAccessor class:
_completionHandlerSignUp = [handler copy];
the normal request code would be here
[request setCompletionBlock:^
{
int statusCode = request.responseStatusCode;
NSDictionary *json = [request.responseString JSONValue];
NSString *status = [json valueForKeyPath:@"status"];
NSLog(@"API JSON %@", request.responseString);
myAccount.statusCode = statusCode;
if(statusCode == 200)
{
myAccount.status = status;
myAccount.error = @"";
myAccount.firstName = firstName;
myAccount.lastName = lastName;
Credentials *myCredentials = [[Credentials alloc] init];
myCredentials.emailAddress = userName;
myCredentials.passWord = passWord;
myAccount.credentials = myCredentials;
[myCredentials release];
}
else if(statusCode == 403)
{
NSString *error = [json valueForKeyPath:@"error"];
myAccount.status = status;
myAccount.error = error;
NSLog(@"API Error %@",error);
}
NSLog(@"TEST - Sending Account Response ");
_completionHandlerSignUp(myAccount);
NSLog(@"TEST - DEALLOCATING OBJECTS ");
[_completionHandlerSignUp release]; <--**EXC_BAD_ACCESS HAPPENS HERE**
_completionHandlerSignUp = nil;
}];
And here is the viewcontroller method:
DataAccessor *dataAccessor = [[DataAccessor alloc] init];
[dataAccessor createAccount:[Utilities getDeviceUDID] user:txtEmail.text password:txtPassword.text firstname:txtFirstName.text lastname:txtLastName.text completion:^(Account *myAccount)
{
[dataAccessor release];
if(myAccount != NULL)
{
NSLog(@"Status: %@", myAccount.status);
NSLog(@"Error: %@", myAccount.error);
if(myAccount.statusCode == 200) //handle successful transaction
{
[Preferences signInUser:myAccount.credentials.emailAddress password:myAccount.credentials.passWord];
[self popViewController]; **<<<<If I remove this, THERE IS NO CRASH******
}
else if(myAccount.statusCode == 403)
{
//todo - handle error
}
}
[self finalUpdate];
}];
- (void) popViewController
{
NSLog(@"TEST - Popping View Controller ");
CATransition* transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
transition.subtype = kCATransitionFromBottom; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom
// MainSelectionMenu *myViewController = [[MainSelectionMenu alloc] initWithNibName:@"MainSelectionMenu" bundle:nil];
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[[self navigationController] popViewControllerAnimated:NO];
}
Something else that is very odd is that my SIGN IN functionality works almost exactly the same way. Sign in calls the SignIN API in the DataAccessor and when it returns in the view controller, it pops the view. However, the SIGN IN functionality works fine and NEVER crashes.
EDIT - Zombies Log:
- Address Category Event Type RefCt Timestamp Size Responsible Library Responsible Caller 0 0x11035a00 ASIFormDataRequest Malloc 1 00:16.125.952 1024 Saveology +[ASIFormDataRequest requestWithURL:] 1 0x11035a00 ASIFormDataRequest Autorelease 00:16.126.025 0 Saveology +[ASIFormDataRequest requestWithURL:] 2 0x11035a00 ASIFormDataRequest Autorelease 00:16.126.026 0 Saveology -[SaveologyDealsDataAccessor createDealsAccount:user:password:firstname:lastname:divisionid:completion:] 3 0x11035a00 ASIFormDataRequest Retain 2 00:16.126.179 0 Foundation NSRecordAllocationEvent 4 0x11035a00 ASIFormDataRequest Retain 3 00:16.126.196 0 Foundation NSRecordAllocationEvent 5 0x11035a00 ASIFormDataRequest Release 2 00:16.126.266 0 Foundation NSRecordAllocationEvent 6 0x11035a00 ASIFormDataRequest Release 1 00:16.126.267 0 Foundation NSRecordAllocationEvent 7 0x11035a00 ASIFormDataRequest Retain 2 00:16.127.268 0 Foundation NSRecordAllocationEvent 8 0x11035a00 ASIFormDataRequest Retain 3 00:16.127.302 0 Foundation NSRecordAllocationEvent 9 0x11035a00 ASIFormDataRequest Release 2 00:16.127.332 0 Foundation NSRecordAllocationEvent 10 0x11035a00 ASIFormDataRequest Retain 3 00:16.128.711 0 Foundation NSRecordAllocationEvent 11 0x11035a00 ASIFormDataRequest Release 2 00:16.128.771 0 Foundation NSRecordAllocationEvent 12 0x11035a00 ASIFormDataRequest Retain 3 00:16.129.880 0 Foundation NSRecordAllocationEvent 13 0x11035a00 ASIFormDataRequest Retain 4 00:16.129.889 0 Foundation NSRecordAllocationEvent 14 0x11035a00 ASIFormDataRequest Release 3 00:16.129.893 0 Foundation NSRecordAllocationEvent 15 0x11035a00 ASIFormDataRequest Release 2 00:16.129.912 0 Foundation NSRecordAllocationEvent 16 0x11035a00 ASIFormDataRequest Retain 3 00:16.309.250 0 Foundation NSRecordAllocationEvent 17 0x11035a00 ASIFormDataRequest Retain 4 00:16.310.289 0 Foundation NSRecordAllocationEvent 18 0x11035a00 ASIFormDataRequest Release 3 00:16.310.396 0 Foundation NSRecordAllocationEvent 19 0x11035a00 ASIFormDataRequest Release 2 00:16.310.640 0 Foundation NSRecordAllocationEvent 20 0x11035a00 ASIFormDataRequest Retain 3 00:16.310.775 0 Foundation NSRecordAllocationEvent 21 0x11035a00 ASIFormDataRequest Retain 4 00:16.310.776 0 Foundation NSRecordAllocationEvent 22 0x11035a00 ASIFormDataRequest Release 3 00:16.310.789 0 Foundation NSRecordAllocationEvent 23 0x11035a00 ASIFormDataRequest Release 2 00:16.310.807 0 Foundation NSRecordAllocationEvent 24 0x11035a00 ASIFormDataRequest Retain 3 00:16.311.443 0 Foundation NSRecordAllocationEvent 25 0x11035a00 ASIFormDataRequest Retain 4 00:16.311.469 0 Foundation NSRecordAllocationEvent 26 0x11035a00 ASIFormDataRequest Retain 5 00:16.311.491 0 Foundation NSRecordAllocationEvent 27 0x11035a00 ASIFormDataRequest Retain 6 00:16.311.496 0 Foundation NSRecordAllocationEvent 28 0x11035a00 ASIFormDataRequest Release 5 00:16.311.501 0 Foundation NSRecordAllocationEvent 29 0x11035a00 ASIFormDataRequest Release 4 00:16.311.546 0 Foundation NSRecordAllocationEvent 30 0x11035a00 ASIFormDataRequest Release 3 00:16.311.557 0 Foundation NSRecordAllocationEvent 31 0x11035a00 ASIFormDataRequest Release 2 00:16.311.563 0 Foundation NSRecordAllocationEvent 32 0x11035a00 ASIFormDataRequest Release 1 00:16.313.736 0 Foundation NSRecordAllocationEvent 33 0x11035a00 ASIFormDataRequest Release 0 00:16.320.573 0 Foundation NSRecordAllocationEvent 34 0x11035a00 ASIFormDataRequest Zombie -1 00:16.320.964 0 GraphicsServices GSEventRunModal
Turn on Zombie Objects to get some more detail about that EXE_BAD_ACCESS error. Should tell you something about the object that it's expecting to be there. This usually means you've dealloc'd the object pointer too early in the execution of the code.
Turning on Zombies: How do I set up NSZombieEnabled in Xcode 4?
What happens when you remove this [_completionHandlerSignUp release] line?