2011-07-19 351 views
0

因此,StackOverflow上的另一個EXC_BAD_ACCESS主題,但由於我是Objective-C的新手,這仍然是我還沒有真正掌握的主題。儘管我已經做了大量的研究。如何擺脫EXC_BAD_ACCESS

問題如下。我有一個UIScrollView,我用自定義類覆蓋(名爲MultiSelectView)。如果用戶點擊此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。有一個更好的方法嗎?因爲現在我有一個包含Tabs的ViewController。在我的activateTab:方法中,我創建了選項卡並沿着self傳遞。我做的viewDidLoad同該標籤的parent傳遞到定製UIScrollView

- (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顯示並突出顯示該行時,將鼠標懸停在視圖上,然後檢查父項並檢查它們是否不等於零。 – macintosh264

+0

他們不等於零。兩者都有一個內存地址,我可以查看它們的屬性等。 – 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

嗯...然後嘗試使用[這裏](http://www.cocoadev.com/index.pl?DebuggingAutorelease)中描述的history_malloc獲取更多信息... – Ariel