2012-01-27 89 views
0

我有一个注册方法,命中一个API来注册一个用户并返回帐户信息。一切正常,但在我的注册视图控制器中,当注册成功时,我弹出注册视图。一旦我弹出注册视图,我会在下面一行获得EXC_BAD_ACCESS。注 - 这只发生在手机上。在模拟器中,这不会发生。不知何故,这似乎是一个时间问题,但我无法弄清楚。例如,如果我在[_completionHandlerSignUp版本]上放置了breakpointer;那么它每次都有效。iOS的ASIFormDataRequest崩溃

这里是我的DataAccessor类我的createAccount方法:

_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; 

    }]; 

这里是视图 - 控制方法:

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

别的东西,这是非常奇怪的是,我的登录功能的作品几乎完全一样。登录调用DataAccessor中的SignIN API,当它在视图控制器中返回时,它会弹出视图。但是,登录功能工作正常,从不崩溃。

编辑 - 僵尸日志:

 
- 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 
+0

嗯,出于某种原因,我可以让它在模拟器中崩溃,一旦僵尸启用,罪魁祸首是ASIFormDataRequest GraphicsServices,但真的没有其他信息:/ – Jesse 2012-01-27 19:45:58

+0

你可以发布僵尸启用时收到的完整错误消息吗? – mccrackend 2012-01-27 19:50:47

+0

添加它,遗憾的格式,但不知道怎么回事,以显示它在SO – Jesse 2012-01-27 20:06:06

回答

0

打开僵尸对象,以获取有关EXE_BAD_ACCESS错误一些更多的细节。应该告诉你一些关于它期望在那里的对象。这通常意味着您在执行代码的时候过早释放了对象指针。

打开僵尸:How do I set up NSZombieEnabled in Xcode 4?

,当你删除此[_completionHandlerSignUp版本]行会发生什么?

+0

我确实让僵尸跑,看上面。另外,当我删除那条线时,它没有什么不同。 – Jesse 2012-01-27 20:06:44