1

私はこの単純なswitchステートメントを持っています:

switch ([sender tag]) {
    case 0:
        [NVAlertView showNVAlertViewFromView:self.view 
                                       title:@"STOCK NUMBER" 
                                 description:@"XXXXXXXXXXX" 
                                 cancelTitle:@"Cancel" 
                                  otherTitle:@"DONE" 
                                dismissBlock:^(BOOL canceled, NSString *description) {
                                    if (!canceled) {
                                        [newItem setObject:description forKey:@"stocknum"];
                                    }
                                }];
        NSLog(@"YOP!");
        break;

    case kDescription:
        [NVAlertView showNVAlertViewFromView:self.view 
                                       title:@"DESCRIPTION" 
                                 description:@"Enter a description here." 
                                 cancelTitle:@"Cancel" 
                                  otherTitle:@"DONE" 
                                dismissBlock:^(BOOL canceled, NSString *description) {
                                    if (!canceled) {
                                        [newItem setObject:description forKey:@"description"];
                                    }
                                }];
        break;

    case kBrandName:
        [NVAlertView showNVAlertViewFromView:self.view 
                                       title:@"BRAND NAME" 
                                 description:@"Enter a brand name here." 
                                 cancelTitle:@"Cancel" 
                                  otherTitle:@"DONE" 
                                dismissBlock:^(BOOL canceled, NSString *description) {
                                    if (!canceled) {
                                        [newItem setObject:description forKey:@"description"];
                                    }
                                }];
        break;

    case kPrice:
        [NVAlertView showNVAlertViewFromView:self.view 
                                       title:@"PRICE" 
                                 description:@"$199.99" 
                                 cancelTitle:@"Cancel" 
                                  otherTitle:@"DONE" 
                                dismissBlock:^(BOOL canceled, NSString *description) {
                                    if (!canceled) {
                                        [newItem setObject:description forKey:@"description"];
                                    }
                                }];
        break;

    default:
        NSLog(@"default");
        break;
}

aa値がデフォルトのケースに達するたびに、「デフォルト」が出力され、EXCBADACCESSが原因でプログラムがクラッシュします。これは何が原因ですか?ありがとう!

4

2 に答える 2

2

EXC_BAD_ACCESS は、多くの場合、既に割り当てが解除されているオブジェクトにアクセスすることによって発生します。

この switch ブロックの後の行にあるオブジェクトをチェックして、保持カウントが 0 を超えていることを確認します。送信者もチェックします。

于 2012-05-07T14:54:16.883 に答える
0

ブロックで値を設定している newItem のスコープは何ですか?

却下ブロックが呼び出されるまでに範囲外になっている可能性があります-アラートビューが表示され、入力を待っていることに注意してください。ただし、コードは実行を続け、switchステートメント(および説明に基づくメソッド)

ブロック内で直接操作を実行する代わりに、newItem を作成してその値を設定する別のメソッドをセットアップし、dismissBlock 内からその特定のメソッドを呼び出すことができます。

于 2012-05-07T16:44:25.950 に答える