2012-10-22 39 views
1

我有一個應用程序,我試圖爲聊天應用程序實現LibPusher API。點擊導航UIBarButtonItem時收到EXC_BAD_ACCESS信號?

該API是啓用了弧,我已經將它包含在我的nonarc項目中。
它工作正常,除了一些警告。

現在我的問題是我在導航欄中添加一個按鈕這樣的:

UIButton *btnNext1 =[[UIButton alloc] init]; 
    [btnNext1 setBackgroundImage:[UIImage imageNamed:@"back_btn.png"] forState:UIControlStateNormal]; 

    btnNext1.frame = CGRectMake(100, 100,60, 31); 
    UIBarButtonItem *btnNext =[[UIBarButtonItem alloc] initWithCustomView:btnNext1]; 
    [btnNext1 addTarget:self action:@selector(backButtonClicked) forControlEvents:UIControlEventTouchUpInside]; 
    self.navigationItem.leftBarButtonItem = btnNext; 
    [btnNext1 release]; 

這是工作的罰款,並在行動我這樣做:

PusherPresenceEventsViewController *rootView = (PusherPresenceEventsViewController*)[self.navigationController.viewControllers objectAtIndex:1]; 
rootView.newmessage [email protected]""; 
[self.navigationController popToViewController:rootView animated:YES]; 
[rootView release]; 

它還工作前兩次罰款。
但是,它第三次給出錯誤的訪問錯誤。
我不明白我出錯的地方,有人可以幫我嗎?

回答

3
UIButton *btnNext1 = [UIButton buttonWithType:UIButtonTypeCustom] 

並且不釋放它。同時釋放Rootview,因爲你沒有分配它。

+1

更正:我認爲你的意思是「同時不要釋放'rootView'因爲你沒有分配它。」這是問題的根源,我認爲它與'UIButton'代碼無關。 – Rob

3

由於iProgrammer正確識別,問題是,你要發佈的東西,你不擁有(佔basic memory management rules,你只有「自己」,你通過開始allocnewcopy方法創建的那些東西,mutableCopy )。刪除[rootView release]和你的問題應該消失。

順便說一句,我建議通過靜態分析儀運行的代碼(選擇「分析」的「產品」菜單上,或按轉變 + 命令 + )。你應該有分析儀產生的警告。這額外的release是分析儀可能引起您注意的問題的一個例子。靜態分析器非常適合尋找各種困擾非ARC代碼的基本內存管理問題。

+0

非常感謝那富有成果的信息....還有一個+1 – hacker

相關問題