2010-01-15 47 views
24

我已閱讀了很多關於這個問題,但我似乎仍然有所不同。 因此,根據我的理解,EXC_BAD_ACCESS出現內存管理問題。EXC_BAD_ACCESS與IBACTION

事情是,我的似乎沒有(!:))在那裏。事情是,我簡單地在IB中添加了一個按鈕,圓角矩形,沒有圖像。我把它與我在課堂上定義的IBACTION聯繫起來。順便說一句,這個方法什麼也不做(!)。

無論如何,只要我點擊按鈕,應用程序崩潰,與「EXC_BAD_ACCESS」。

就我所知,我確實不會放過任何東西,就是這樣。那裏有什麼問題?

任何線索?

這是我的控制檯日誌:

Loading program into debugger… 
sharedlibrary apply-load-rules all 
Program loaded. 
target remote-mobile /tmp/.XcodeGDBRemote-148-79 
Switching to remote-macosx protocol 
mem 0x1000 0x3fffffff cache 
mem 0x40000000 0xffffffff none 
mem 0x00000000 0x0fff none 
run 
Running… 
[Switching to thread 11779] 
[Switching to thread 11779] 
(gdb) continue 
2010-01-15 09:16:34.800 FlightControl1[1899:207] Table loaded 
2010-01-15 09:16:35.200 FlightControl1[1899:207] 23 
2010-01-15 09:16:35.350 FlightControl1[1899:207] debug 
Program received signal: 「EXC_BAD_ACCESS」. 
(gdb) 

這是我所得到的,當我走到堆棧:

#0 0x31ec3ebc in objc_msgSend() 
#1 0x33605784 in -[UIApplication sendAction:to:from:forEvent:]() 
#2 0x336056ec in -[UIApplication sendAction:toTarget:fromSender:forEvent:]() 
#3 0x336056b4 in -[UIControl sendAction:to:forEvent:]() 
#4 0x3360530c in -[UIControl(Internal) _sendActionsForEvents:withEvent:]() 
#5 0x33605f8c in -[UIControl touchesEnded:withEvent:]() 
#6 0x335fd9ac in _UIGestureRecognizerUpdateObserver() 
#7 0x30da1830 in __CFRunLoopDoObservers() 
#8 0x30de9346 in CFRunLoopRunSpecific() 
#9 0x30de8c1e in CFRunLoopRunInMode() 
#10 0x332e7374 in GSEventRunModal() 
#11 0x335adc30 in -[UIApplication _run]() 
#12 0x335ac230 in UIApplicationMain() 
#13 0x000027a8 in main (argc=1, argv=0x2ffff4d8) at /Users/SomePath/main.m:14 
+0

請問您可以在控制檯日誌中粘貼? – 2010-01-15 08:08:24

+0

也請注意,IBACTION本身不過是IB用於查找項目的佔位符。在預處理後查看代碼,IBACTIONs不存在 – KevinDTimm 2010-01-15 08:10:56

+0

我將我的控制檯日誌添加到問題中。 @kevin:說實話,我不知道該怎麼做。 – Icky 2010-01-15 08:18:12

回答

53

我也被這個幾個小時,以及酷刑。結果如預期的那樣是一個記憶問題。充當按鈕目標的控制器已被釋放。它是導航控制器的根控制器,其視圖直接添加到窗口中。我的代碼是這樣的:

MyController *myController = [[MyController new] autorelease]; 
UINavigationController* navController = 
    [[[UINavigationController alloc] initWithRootViewController:myController] autorelease]; 
[window addSubview:navController.view]; 

我的假設是,當它作爲UINavigationController根控制器的傳遞myController將保留,但被證明是錯誤的。解決方案是將控制器分配給一個局部變量並將其釋放到dealloc中。含有上述代碼中的對象的接口中應具有:

... 
@property (retain, nonatomic) MyController *myController; 
... 

和實現:

self.myController = [[MyController new] autorelease]; 
UINavigationController* navController = 
    [[[UINavigationController alloc] initWithRootViewController:myController] autorelease]; 
[window addSubview:navController.view]; 

... 

- (void)dealloc { 
    [self.myController release]; 
    ... 
    [super dealloc]; 
} 
+0

謝謝! initWithRootViewController不保留根視圖是瘋狂的。 – esbenr 2012-07-03 08:10:50

+0

怎麼辦在ARC? – 2012-07-05 11:33:51

+0

您是否在分配之後呈現導航控制器? – 2012-08-28 10:45:01

0

我有一個想法。那在我以前發生過。在IB中,您的視圖屬性是否符合您的視圖?

我曾經解開這些,並且應用程序從未啓動。

順便說一句,更糟糕的是,再次啓動項目。如果你迄今爲止已經完成了2分鐘的工作,那麼不值得這些頭痛。

歡迎來到iPhone編程的世界。 你可能需要這些很快wigsmen.com之一;-)

4

如甘默爾等人指出,這是一個存儲器的問題。這是與控制器引用超出範圍,因此其內存被釋放。

如果啓動控制器是這樣的:

MyController* controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil]; 
[self.view addSubview:controller.view]; 

,如果你不使用ARC,因爲引用不會被釋放,直到它被手動釋放,你就會沒事。所以在升級項目使用ARC時,我遇到了這個問題。

如果您啓動控制器作爲autorelease或正在使用ARC,那麼只要控制器存在的作用域結束,垃圾收集器將釋放控制器,按按鈕事件將導致內存異常錯誤。

解決此問題的方法是使引用保持活動狀態,以便在接口上聲明它,或者如果它需要外部訪問作爲屬性。

@interface MyParentController : UIView { 
@private 
    MyController* controller; 
} 

然後將其添加喜歡:

controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil]; 
[self.view addSubview:controller.view]; 

如果你想它的內存被收集後,只需將該值設置爲零。