EXC_BAD_ACCESS с IBACTION
Я много читал об этой проблеме, но мой по-прежнему кажется каким-то другим.
Поэтому из того, что я понял, EXC_BAD_ACCESS возникает с проблемами управления памятью.
Дело в том, что мой не кажется (!:)), чтобы быть там. Дело в том, что я просто добавил кнопку в 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
Ответы
Ответ 1
Меня тоже пытали на несколько часов. Это оказалось проблемой памяти, как и ожидалось. Контроллер, выступающий в качестве цели для кнопки, был освобожден. Это был корневой контроллер навигационного контроллера, представление которого было добавлено непосредственно в окно. Мой код выглядел так:
MyController *myController = [[MyController new] autorelease];
UINavigationController* navController =
[[[UINavigationController alloc] initWithRootViewController:myController] autorelease];
[window addSubview:navController.view];
Мое предположение заключалось в том, что myController
будет сохранен, когда он будет передан в качестве корневого контроллера UINavigationController
, но это оказалось неправильным. Решение заключалось в том, чтобы назначить контроллер локальной переменной и отпустить его в 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];
}
Ответ 2
Как заметил гэммал и другие, это проблема памяти. Это связано с тем, что контрольная ссылка выпадает из области действия и поэтому ее память освобождается.
Если вы инициируете контроллер следующим образом:
MyController* controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil];
[self.view addSubview:controller.view];
Все будет в порядке, если вы не используете ARC, потому что ссылка не будет освобождена до тех пор, пока она не будет выпущена вручную. Поэтому у меня была эта проблема при обновлении проектов для использования ARC.
Если вы инициируете контроллер как авторекламу или используете ARC, то, как только область, в которой находится контроллер, заканчивается, сборщик мусора освободит контроллер, а события нажатия кнопки вызовут неправильные исключения памяти.
Способ решения проблемы заключается в том, чтобы сохранить ссылку в активном состоянии, поэтому объявите ее на интерфейсе или если для доступа требуется внешний доступ как свойство.
@interface MyParentController : UIView {
@private
MyController* controller;
}
Затем добавьте его как:
controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil];
[self.view addSubview:controller.view];
Если вы захотите, чтобы память была собрана позже, просто установите значение равным нулю.
Ответ 3
У меня есть мысль. Это случилось со мной давным-давно. IN IB, ваш объект View привязан к вашему виду?
Я однажды отвязал их, и приложение никогда не запускалось.
Btw, хуже ухудшается, снова начните проект. Не стоит этих головных болей, если вы сделали 2 минуты работы до сих пор.
добро пожаловать в мир iPhone-программирования.
Возможно, вам понадобится один из этих довольно скоро wigsmen.com; -)