2010-11-23 10 views
1

私はなぜこれが私にEXC_BAD_ACCESSを与えているのか分かりません。基本的な背景、いくつかの情報を収集して処理し、次にモーダルビューを使用して、続行したいかどうかをユーザーに確認させる。Iphone UIAlertViewはEXC_BAD_ACCESSをスローします。 - 編集、UIAlertViewによって引き起こされない

私はナビゲーションバーにcontinueと呼ばれるボタンがあり、それは私のデータ準備機能を呼び出します。

- (void)viewDidLoad { 
    //Other stuff 
    UIBarButtonItem *next = [[UIBarButtonItem alloc] 
            initWithTitle:@"Next" 
            style:UIBarButtonItemStyleBordered 
            target:self 
            action:@selector(prepData)]; 
    self.navigationItem.rightBarButtonItem = next; 
    [next release]; 
    [super viewDidLoad]; 
} 

prepData:

-(void)prepData{ 
    /* 
    There's a bunch of stuff going on here, if "mensaje" is not an empty NSString, there is some kind of error that wont let me go on, if not, everything in the data is fine 
    */ 
    if(![mensaje isEqualToString:@""]){ 
     UIAlertView *alert = [[UIAlertView alloc] 
           initWithTitle:nil 
           message:mensaje 
           delegate:nil 
           cancelButtonTitle:@"Aceptar" 
           otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
    }else{ 
     UIActionSheet *actionSheet = [[UIActionSheet alloc] 
             initWithTitle:@"¿Esta seguro que desea realizar estas operaciones?" 
             delegate:self 
             cancelButtonTitle:@"Cancelar" 
             destructiveButtonTitle:@"Aceptar" 
             otherButtonTitles:nil]; 
     [actionSheet showInView:self.view]; 
     [actionSheet release]; 
    } 
} 

私はデバッグする場合、私はEXC_BAD_ACCESSを取得し続けるとすぐに私が押すと、)(prepDataを介してすべての方法を取得することができます。私が[actionSheet release]をコメントアウトすると、例外はありませんが、私の知る限りでは、警告表示のように、アクションシートは表示されるまで「スティック」しています。

少なくとも私が読んだ本はそれを述べていますが、私はオートレリースで何かを理解していない可能性が非常に高いです。

参考のため、アラートが表示されます。

誰もがここで何が起こっているか考えている?

ありがとう、ステファノ。

編集:アクションシートとアラートビューのための上記のコードはうまくいきました。問題は、後に自動リリースしようとしていたものをリリースしていたことでした。

私はこれを行うforループをしている:[:montoFormateado NSStringのstrintWithString]を、私は、後にautoreleaseため、その文字列を上に残していたが

for(someConditions){ 
    NSString *montoFormateado = [[[NSString alloc] initWithFormat:@"%.2lf",[monto doubleValue]] stringByReplacingOccurrencesOfString:@"." withString:@","]; 
        [_postBuild setObject:[NSString stringWithString:montoFormateado] forKey:[NSString stringWithString:iidvar]]; 
        [montoFormateado release]; 
}        
postBuild = [_postBuild mutableCopy]; 
[_postBuild release]; 

、エラーが使用しているという事実にあったようです私は_postBuildをリリースしました。その文字列もリリースされました。私はそれを取り除き、setObject:montoFormateadoとそのうまく動作しました。

メモリが漏れていますが、私は別の質問のためにexc_bad_accessが解決したと思います。

+0

非常に小さいものですが、一般的には、メソッドの最後ではなく変更を加える前に[super viewDidLoad]を呼び出す方が良いと思います。メソッドの最後に[super xxx]を入れたいときは、deallocを呼び出すときだけです。 – makdad

+0

先端のためのThanx、それを変える。私が何かを得るかどうかを見るためにゾンビを試してみましょう。 – blindstuff

+0

問題はおそらくあなたが放棄したコードにあります。おそらく、頻繁にmensajeがリリースされる(つまり、自動リリースされた文字列をリリースする)可能性があります。 – Eiko

答えて

4

この種のバグを見つける最も簡単な方法は、NSZombieEnabled環境変数を使用することです。

コール終了時にEXC_BAD_ACCESSを取得すると、通常は何かがオートリリースされていることを意味しますが、リリースカウントはすでに0になっています。

this postをチェックすると、多くの時間を節約できます。それでも問題が解決しない場合は、コメントを残してください。

+0

これを解決するためにNSZombiesEnabledを使用していたのでこれを受け入れましたが、これとStephensの両方の答えは正しいです。 – blindstuff

-1

その使用、リリース文を削除しようとすると、自動リリースとしてUIAlertViewを宣言する前に、たぶん、あなたがUIAlertViewをリリースしている(それはあなたがそれを持っている方法で問題ないはずですが)

if(![mensaje isEqualToString:@""]){ 
     UIAlertView *alert = [[UIAlertView alloc] 
           initWithTitle:nil 
           message:mensaje 
           delegate:nil 
           cancelButtonTitle:@"Aceptar" 
           otherButtonTitles:nil] autorelease]; 
     [alert show]; 

もう一つは、それは可能性があることをあなたがコールバックや何かでこれらの人を再び解放しているということです、あなたはそれをしていないことを確認してください、私の上のポスターが言ったように、あなたはこの事を把握するためにゾンビを使用することができます。

+0

私は彼のUIAlertViewのリリースがいいと思います。 1. UIAlertViewを割り当てます。2. UIAlertViewを表示します。3. UIAlertViewをリリースします(すべて同じスコープ内にあります)。 Appleからのプロジェクトの例私はまた、UIActionSheetsがshowInViewを呼び出した後にアクションシートを解放することも見てきました。 –

+0

-1 alloc/show/releaseが正しい順序です。 – Eiko

-1

どちらの場合も、「リリース」するつもりならば、最初に「保持」してください。

UIActionSheetの場合、showInViewに渡されたビューには、アクションシートのコピーが保持されていると思います。

AlertViewでは、これは当てはまりません。

+0

-1 alloc/show/releaseは正しい順序です。 – Eiko

1

あなたが表示していないコードには、あまりにも多くのリリースがあると思います(「mensajeが空のNSStringブロックではない場合、ここにはたくさんのものがあります」)。

actionSheetコードに問題はありません。あなたが言うように、それが画面に表示されなくなったら、自分自身の割り当てを解除する必要があります。しかし、self.viewのサブビューの1つを過度にリリースした場合、自動解放プールが排水されるとクラッシュする可能性があります。

関連する問題