0

API をヒットしてユーザーをサインアップし、アカウント情報を返すサインアップ メソッドがあります。すべて正常に動作しますが、私のサインアップ ビュー コントローラーでは、サインアップが成功すると、サインアップ ビューがポップされます。サインアップ ビューをポップすると、下の行に EXC_BAD_ACCESS が表示されます。注 - これは電話でのみ発生します。シミュレーターでは、これは起こりません。どうやらタイミングの問題のようですが、わかりません。たとえば、[_completionHandlerSignUp release]; にブレークポインターを設定するとします。その後、毎回動作します。

これが私の 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;

     }];

そして、ここにviewcontrollerメソッドがあります:

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 を呼び出し、View Controller に戻ると、ビューをポップします。ただし、サインイン機能は正常に機能し、クラッシュすることはありません。

編集 - ゾンビ ログ:

- アドレス カテゴリ イベント タイプ RefCt タイムスタンプ サイズ 責任ライブラリ 責任発信者
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 保持 2 00:16.126.179 0 Foundation NSRecordAllocationEvent
4 0x11035a00 ASIFormDataRequest 保持 3 00:16.126.196 0 Foundation NSRecordAllocationEvent
5 0x11035a00 ASIFormDataRequest リリース 2 00:16.126.266 0 Foundation NSRecordAllocationEvent
6 0x11035a00 ASIFormDataRequest リリース 1 00:16.126.267 0 Foundation NSRecordAllocationEvent
7 0x11035a00 ASIFormDataRequest 保持 2 00:16.127.268 0 Foundation NSRecordAllocationEvent
8 0x11035a00 ASIFormDataRequest 保持 3 00:16.127.302 0 Foundation NSRecordAllocationEvent
9 0x11035a00 ASIFormDataRequest リリース 2 00:16.127.332 0 Foundation NSRecordAllocationEvent
10 0x11035a00 ASIFormDataRequest 保持 3 00:16.128.711 0 Foundation NSRecordAllocationEvent
11 0x11035a00 ASIFormDataRequest リリース 2 00:16.128.771 0 Foundation NSRecordAllocationEvent
12 0x11035a00 ASIFormDataRequest 保持 3 00:16.129.880 0 Foundation NSRecordAllocationEvent
13 0x11035a00 ASIFormDataRequest 保持 4 00:16.129.889 0 Foundation NSRecordAllocationEvent
14 0x11035a00 ASIFormDataRequest リリース 3 00:16.129.893 0 Foundation NSRecordAllocationEvent
15 0x11035a00 ASIFormDataRequest リリース 2 00:16.129.912 0 Foundation NSRecordAllocationEvent
16 0x11035a00 ASIFormDataRequest 保持 3 00:16.309.250 0 Foundation NSRecordAllocationEvent
17 0x11035a00 ASIFormDataRequest 保持 4 00:16.310.289 0 Foundation NSRecordAllocationEvent
18 0x11035a00 ASIFormDataRequest リリース 3 00:16.310.396 0 Foundation NSRecordAllocationEvent
19 0x11035a00 ASIFormDataRequest リリース 2 00:16.310.640 0 Foundation NSRecordAllocationEvent
20 0x11035a00 ASIFormDataRequest 保持 3 00:16.310.775 0 Foundation NSRecordAllocationEvent
21 0x11035a00 ASIFormDataRequest 保持 4 00:16.310.776 0 Foundation NSRecordAllocationEvent
22 0x11035a00 ASIFormDataRequest リリース 3 00:16.310.789 0 Foundation NSRecordAllocationEvent
23 0x11035a00 ASIFormDataRequest リリース 2 00:16.310.807 0 Foundation NSRecordAllocationEvent
24 0x11035a00 ASIFormDataRequest 保持 3 00:16.311.443 0 Foundation NSRecordAllocationEvent
25 0x11035a00 ASIFormDataRequest 保持 4 00:16.311.469 0 Foundation NSRecordAllocationEvent
26 0x11035a00 ASIFormDataRequest 保持 5 00:16.311.491 0 Foundation NSRecordAllocationEvent
27 0x11035a00 ASIFormDataRequest 保持 6 00:16.311.496 0 Foundation NSRecordAllocationEvent
28 0x11035a00 ASIFormDataRequest リリース 5 00:16.311.501 0 Foundation NSRecordAllocationEvent
29 0x11035a00 ASIFormDataRequest リリース 4 00:16.311.546 0 Foundation NSRecordAllocationEvent
30 0x11035a00 ASIFormDataRequest リリース 3 00:16.311.557 0 Foundation NSRecordAllocationEvent
31 0x11035a00 ASIFormDataRequest リリース 2 00:16.311.563 0 Foundation NSRecordAllocationEvent
32 0x11035a00 ASIFormDataRequest リリース 1 00:16.313.736 0 Foundation NSRecordAllocationEvent
33 0x11035a00 ASIFormDataRequest リリース 0 00:16.320.573 0 Foundation NSRecordAllocationEvent
34 0x11035a00 ASIFormDataRequest ゾンビ -1 00:16.320.964 0 GraphicsServices GSEventRunModal
4

1 に答える 1

0

ゾンビ オブジェクトをオンにして、その EXE_BAD_ACCESS エラーに関する詳細を取得します。そこにあると期待しているオブジェクトについて何かを教えてくれるはずです。これは通常、コード実行の早い段階でオブジェクト ポインターの割り当てを解除したことを意味します。

ゾンビを有効にする: Xcode 4 で NSZombieEnabled を設定するにはどうすればよいですか?

この [_completionHandlerSignUp release] 行を削除するとどうなりますか?

于 2012-01-27T19:47:59.290 に答える