EXC_BAD_ACCESS с распознавателем жестов и раскадровкой - PullRequest
3 голосов
/ 20 января 2012

У меня есть программно созданная раскадровка (так как я использую ее только для iOS 5) с простым контроллером и представлением iPad. Мне нужен распознаватель жестов и добавил это. Но когда приложение загружается, и я становлюсь более мрачным, я получаю EXC_BAD_ACCESS:

*** - [DOiPadStoryboardViewController handleSliding:]: сообщение отправлено освобожденному экземпляру 0x238580

Должно быть, я что-то не так делаю. Почему контроллер освобожден?

Я создаю раскадровку со следующим кодом:

if (isIOS5) {
    // iOS 5 with storyboard
    UIViewController *viewControler = nil;
    if([self isiPad]){
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"iPadStoryboard" bundle: [NSBundle mainBundle]];
        viewControler = [storyboard instantiateInitialViewController];
    } else {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"iPhoneStoryboard" bundle: [NSBundle mainBundle]];
        viewControler = [storyboard instantiateInitialViewController];
    }
    [self.window addSubview:viewControler.view];
} 

Распознаватель жестов подключен к основному виду, а IBAction находится в контроллере вида. Раскадровка выглядит следующим образом (но не уверен, добавит ли это что-нибудь): Storyboard

и это распознаватель Pan Gesture: Gesture properties

и, наконец, вывод консоли 'bt':

#0  0x37d2b8a0 in ___forwarding___ ()
#1  0x37c86680 in __forwarding_prep_0___ ()
#2  0x318d2f06 in _UIGestureRecognizerSendActions ()
#3  0x31864c1c in -[UIGestureRecognizer _updateGestureWithEvent:] ()
#4  0x31a90508 in ___UIGestureRecognizerUpdate_block_invoke_0541 ()
#5  0x317dfd68 in _UIGestureRecognizerApplyBlocksToArray ()
#6  0x317de8b6 in _UIGestureRecognizerUpdate ()
#7  0x317eb3cc in _UIGestureRecognizerUpdateGesturesFromSendEvent ()
#8  0x317eb20e in -[UIWindow _sendGesturesForEvent:] ()
#9  0x317eaddc in -[UIWindow sendEvent:] ()
#10 0x317d14ec in -[UIApplication sendEvent:] ()
#11 0x317d0d2c in _UIApplicationHandleEvent ()
#12 0x37a57df2 in PurpleEventCallback ()
#13 0x37cfd552 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#14 0x37cfd4f4 in __CFRunLoopDoSource1 ()
#15 0x37cfc342 in __CFRunLoopRun ()
#16 0x37c7f4dc in CFRunLoopRunSpecific ()
#17 0x37c7f3a4 in CFRunLoopRunInMode ()
#18 0x37a56fcc in GSEventRunModal ()
#19 0x317ff742 in UIApplicationMain ()
#20 0x00003050 in main (argc=1, argv=0x2fdffaa8)

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Установите контроллер представления в качестве корневого контроллера представления вашего окна вместо добавления его представления в качестве подпредставления - что является устаревшим и не рекомендуется Apple, поскольку вы отсоединяете иерархию представлений от иерархии контроллеров представлений, что, в свою очередь, в конечном итоге приведетнеприятные ошибки, такие как ваши контроллеры представления, не получающие обратные вызовы вращения, и т. д. и т. д.

Кстати, ваш контроллер представления будет сохраняться окном, и больше не будет сбоев.

1 голос
/ 20 января 2012

Просто сделайте viewControler (сохраненным) свойством.Вы не сохраняете контроллер представления в своем примере кода.

Создайте свойство в файле .h:

@property (retain) UIViewController *viewController;

В файле .m добавьте:

@synthesize viewController;

Также измените назначение:

self.viewControler = [storyboard instantiateInitialViewController];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...