2011-07-19 22 views
0

StackOverflowに関するもう1つのEXC_BAD_ACCESSトピックですが、Objective-Cを初めて使ったので、これはまだまだ私がまだ理解していないトピックです。私はすでにそれについて多くの研究を行っていますが。EXC_BAD_ACCESSを取り除く方法

問題は次のとおりです。私はカスタムクラス(MultiSelectView)を使って上書きしたUIScrollViewを持っています。ユーザーがこのUIScrollViewをタップした後、一部のデータを選択できるようにするビューを開きたいとします。

UITapGestureRecognizerと言って、openMultiSelect:メソッドを呼び出すと宣言しました。しかし、[parent.navigationController pushViewController:view animated:YES];行に私はProgram received signal: "EXC_BAD_ACCESS".エラーが発生します。理由はなぜですか?

- (id) initWithCoder:(NSCoder *) coder { 
    self = [super initWithCoder: coder]; 

    if (self) { 
     // Add a Tap Gesture Recognizer to the Scrollview. 
     // If the user taps the view, it triggers the 'openMultiSelect' method. 
     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openMultiSelect:)]; 
     [singleTap setNumberOfTapsRequired:1]; 
     [singleTap setNumberOfTouchesRequired:1]; 
     [self addGestureRecognizer:singleTap]; 
    } 

    return self; 
} 

- (void)openMultiSelect:(UIGestureRecognizer *)gesture { 
    //int myViewTag = gesture.view.tag; // now you know which view called 

    DataSelectView *view = [[DataSelectView alloc] initWithNibName:@"DataSelectView" bundle:[NSBundle mainBundle]]; 
    view.allowMultiSelect = YES; 

    [parent.navigationController pushViewController:view animated:YES]; 
    [view release]; 
} 

したがって、表示されるparentは、タブを含むViewControllerです。これを行うより良い方法はありますか?今のところ私はTabを含むViewControllerを持っているからです。そのactivateTab:メソッドでは、このようにしてタブを作成し、selfを渡します。 IカスタムUIScrollViewparentを渡すために、そのタブのviewDidLoadで同じ操作を行います。ビューがあるまで、早すぎるオブジェクト「ビュー」をリリースされ何が間違ってやっている

- (void) activateTab:(int)index { 
    ... code ... 

    self.tab_Basic = [[TabBasic alloc] initWithNibName:@"TabBasic" bundle: [NSBundle mainBundle]]; 
    self.tab_Basic.parent = self; 

    ... code ... 
} 
+2

私は、NSZombieEnabledを有効にすると本当にデバッグに役立つことがわかりました。 Obj-Cはかなり混乱する可能性があります:/ – Pepe

答えて

-1

、それを解放しないでくださいポップ。それは問題を解決するはずです。

- (void)openMultiSelect:(UIGestureRecognizer *)gesture { 
//int myViewTag = gesture.view.tag; // now you know which view called 

DataSelectView *view = [[DataSelectView alloc] initWithNibName:@"DataSelectView" bundle:[NSBundle mainBundle]]; 
view.allowMultiSelect = YES; 

[parent.navigationController pushViewController:view animated:YES]; 
+0

私の '[view release];を残しても、プログラムは' [parent.navigationController pushViewController:view animated:YES];の 'EXC_BAD_ACCESS'エラーでクラッシュします。 – Jules

+1

デバッグ時に、xcodeが表示され、ハイライト表示されたら、マウスをビュー上に移動し、parentをチェックして、両方がnilでないことを確認します。 – macintosh264

+0

これらはnilと等しくありません。どちらもメモリアドレスがあり、プロパティなどを見ることができます。 – Jules

0

コールバックメソッドを変更する必要があります。何かそんなこと:

- (void)openMultiSelect:(UIGestureRecognizer *)gesture { 
    //int myViewTag = gesture.view.tag; // now you know which view called 
    if(gesture.state == UIGestureRecognizerStateEnded){ 
     DataSelectView *view = [[DataSelectView alloc] initWithNibName:@"DataSelectView" bundle:[NSBundle mainBundle]]; 
     view.allowMultiSelect = YES; 

     [parent.navigationController pushViewController:view animated:YES]; 
     [view release]; 
    } 
} 
+0

私はそれを追加しましたが、何も変わりません。まだEXC_BAD_ACCESSです。どのオブジェクトがこれを引き起こしているかについて、Xcodeからより多くの情報を得る方法はありませんか? – Jules

+0

ええと...次に、[here](http://www.cocoadev.com/index.pl?DebuggingAutorelease)の説明に従って、history_mallocを使って詳細情報を取得しようとします... – Ariel