2013-03-03 3 views
-3

У меня есть табельный вид с пользовательскими ячейками, которые были созданы в другом банке, В каждой ячейке у меня есть кнопка. Я не имел дело с нажатием кнопки события в одном из моих созданных объектов (я называю это PlaylistController). В IB я добавил этот класс (PlaylistController) в качестве объекта, а затем перетащил действие Touch Up Inside в представление объекта в IB и внедрил простое предупреждение при нажатии кнопки. Но когда я нажимаю кнопку на симуляторе, я получаю EXC_BAD_ACCESS; Моя трассировка:iOS: EXC_BAD_ACCESS При нажатии кнопки

Thread 1, Queue : com.apple.main-thread 
0 0x010ea09b in objc_msgSend() 
1 0x000202c0 in -[UIApplication sendAction:to:from:forEvent:]() 
6 0x002e41d3 in _UIGestureRecognizerUpdate() 
7 0x01c63afe in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() 
11 0x01c40e1b in CFRunLoopRunInMode() 
12 0x01bf57e3 in GSEventRunModal() 
13 0x01bf5668 in GSEventRun() 
14 0x0001cffc in UIApplicationMain() 
15 0x0000227d in main at /Users/bysdan/Documents/workspace/Starling/Starling/main.m:16 
16 0x000021a5 in start() 

P.S.
Я также пытался сделать это с помощью External Object вместо Object, но затем я получаю исключение в строке, где я пытаюсь получить доступ к nib.

NSArray *nibObjs = [[NSBundle mainBundle] loadNibNamed:@"PlaylistCell" owner:nil options:nil];

Как я могу это сделать?

Спасибо.

+2

Что такое код для плохого доступа и что говорит консоль? – CodaFi

+0

код 1, консоль ничего не говорит ... – RCB

+2

Похоже, что ресивер был освобожден из-под вашего носа. Покажите мне, как это объявлено в .h (строка IBOutlet для него). – CodaFi

ответ

2

Как я и боялся: ваш получающий объект был освобожден прямо из-под вас и по одной очевидной причине: он не хранится сильно. IB берет это добросовестно, что у вас есть желание сохранить объекты верхнего уровня, о которых вы ссылаетесь позже в коде. Когда XIB получает dearchived, и объект, который вы опубликовали, не имеет владельца (вне исходного NSCoder), то, естественно, предполагается, что он может быть освобожден без последствий. Конечно, проблема в том, что IB уже привязал объект к действию вашей кнопки. Итак, когда кнопка вызывает объект, BOOM! Просто добавьте свойство IBOutlet-prefixed, представляющее объект, и оно должно очиститься.