2012-03-08 62 views
2

我一直在撓頭,現在很長一段時間,試圖解決這個問題。我搜索了StackOverflow,發現有人要求類似this questionthis question的問題,但沒有給出的答案對我有幫助。EXC_BAD_ACCESS當解散modalViewController iOS5

爲了具體說明該問題:

  1. 我使用蘋果的尋呼例子,使視圖控制器之間的尋呼
  2. 觀層次結構如下:一個UIWindow - >的UIScrollView(MainController) - > UIViewControllers。

    我使用此代碼創建一個委託到ViewController包含的UIScrollView:

    if(page == 0) 
    { 
        ContractsViewController *controller = [viewControllers objectAtIndex:page]; 
    
        if ((NSNull *) controller == [NSNull null]) 
        { 
         controller = [[ContractsViewController alloc] initWithNibName:@"ContractsView" bundle:nil]; 
         controller.delegate = self; 
         [viewControllers replaceObjectAtIndex:page withObject:controller]; 
         [controller release]; 
        } 
    
        // add the controller's view to the scroll view 
        if (controller.view.superview == nil) 
        { 
         CGRect frame = scrollView.frame; 
         frame.origin.x = frame.size.width * page; 
         frame.origin.y = 0; 
         controller.view.frame = frame; 
         controller.view.tag = 0; 
         [scrollView addSubview:controller.view]; 
    
        } 
    } 
    

問題狀態出現,當我嘗試從我的ViewController呈現滾動視圖內modalviewcontroller使用委託。它工作了幾次,但然後給了我一個EXC_BAD_ACCESS。我也嘗試發佈通知,並在MainController中創建一個監聽器,以這種方式呈現,但仍然是同樣的問題。

在iOS 4.3中測試時,一切都像魅力一樣,但在iOS5中,我遇到了問題。

我希望有人能幫我擺脫這個問題。

預先感謝您。

+0

你有沒有嘗試在Xcode中設置殭屍檢測?您的問題可能與內存釋放相關,只是您嘗試將消息發送到釋放的代理的猜測。 – Leonardo 2012-03-08 10:17:29

+0

是的,我有,但NSZombie不給我任何反饋 – Krueger 2012-03-08 10:46:39

+0

你如何得到viewControllers?你有沒有放置一些斷點?你在什麼路線變得bad_access?你如何稱呼模態視圖? – Leonardo 2012-03-08 10:53:58

回答

1

作爲一個開始感謝你所有的答案!我終於找到了解決問題的辦法。

正如我的問題中提到的,我使用Apple的Pagecontrol sample作爲我的項目的模板。這個模板有一個rootViewController,它有一個包含UIScrollview和Pagecontrol的窗口的XIB。

這個問題發生時,我試圖從滾動視圖中的UIViewController呈現ModalView。我想使用委託,通過rootViewController呈現它,但發現它使用UIScrollview來呈現它。

UIScrollView對象顯然沒有被保留,所以在幾次解散之後,我點擊了EXC_BAD_ACCESS。

然後我想到,我需要一個UIView在rootViewController中,並將它放在XIB的底層viewhierachy中,並將它與rootViewController的視圖連接起來。在我這樣做之後,我可以在UIViewController中使用[delegate present ..]和[delegate dismiss ..],而不使用EXC_BAD_ACCESS。

耶! :)

0

我想我看到你的問題..在第一個如果你釋放controller對象,然後你嘗試在第二個循環中使用它,因爲你收到了這個。在兩個if循環都通過後釋放控制器對象。

編輯

試試這個代碼,而不是..

if(page == 0) 
{ 
    ContractsViewController *controller = [viewControllers objectAtIndex:page]; 

    if ((NSNull *) controller == [NSNull null]) 
    { 
     controller = [[[ContractsViewController alloc] initWithNibName:@"ContractsView" bundle:nil]autorelease]; 
     controller.delegate = self; 
     [viewControllers replaceObjectAtIndex:page withObject:controller]; 
    } 

    // add the controller's view to the scroll view 
    if (controller.view.superview == nil) 
    { 
     CGRect frame = scrollView.frame; 
     frame.origin.x = frame.size.width * page; 
     frame.origin.y = 0; 
     controller.view.frame = frame; 
     controller.view.tag = 0; 
     [scrollView addSubview:controller.view]; 

    } 
} 
+0

它沒有幫助不幸。我可以第一次顯示ModalViewController,但是當我試圖再次呈現它時,我收到了「發送到釋放實例0x8c9ee90的消息」。 我也試過在我的MainController頭文件中保留viewcontroller,但問題保持不變。 – Krueger 2012-03-08 09:10:18

+0

@Krueger請檢查編輯。 – 2012-03-08 09:16:38

+0

我可以看到,sveinungkb建議相同。我只是試過了,而且它似乎工作。我可以提交和解僱modalviewcontroller 10次以上,但是它再次給了我EXC_BAD_ACCESS。在modalviewcontroller,我介紹它,我已經triede使用[self.delegate presentModalViewController:]和[_delegate presentModalViewController:]但它沒有幫助 – Krueger 2012-03-08 10:31:58

0

我建議取消你的[controller release];並添加一個自動釋放:controller = [[[ContractsViewController alloc] initWithNibName:@"ContractsView" bundle:nil] autorelease]; 你不擁有controller當它從objectAtIndex:返回,所以這樣你可以對兩個控制器有相同的行爲,沒有版本。

+0

請參閱我對Ankit Srivastava的回答的評論。 – Krueger 2012-03-08 09:29:07

0

嘗試使用NSZombiesEnabled運行代碼。

我的猜測是,viewControllers對象是永遠不會被初始化或被提前釋放。

此外,還有這個if (page == 0) wierdness:

if(page == 0) // <== only the first page ever gets the init code calling 
{ 
    ContractsViewController *controller = [viewControllers objectAtIndex:page]; 

    if ((NSNull *) controller == [NSNull null]) 
    { 
     // ** SNIP ** 

     [viewControllers replaceObjectAtIndex:page // <<=== always 0 
            withObject:controller]; 
     [controller release]; 
    } 

    // ** SNIP ** 

} 
+0

我已經試過了。但我沒有收到任何反饋。我只是得到普通的舊的EXC_BAD_ACCESS。我也使用過樂器,但是當我敲擊EXC_BAD_ACESS樂器時停下來,並且沒有任何堆疊痕跡。 – Krueger 2012-03-08 11:49:36

+0

在說['viewControllers replaceObjectAtIndex:page withObject:controller];'並確保viewControllers不是nil的行上放置一個斷點。 – JeremyP 2012-03-08 13:39:42

+0

我剛查過。它不是零,但它應該包含對象。 – Krueger 2012-03-08 14:04:21