Подтвердить что ты не робот

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
4b9b3361

Ответ 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; -)