сбой делегата с EXC_BAD_ACCESS - PullRequest
3 голосов
/ 15 июля 2011

У меня есть делегат

@property (nonatomic, assign) id <DelegateProtocol> delegate;

но происходит сбой при executeSelector

if (_delegate != nil && [_delegate conformsToProtocol:@protocol(DelegateProtocol)])
{
    NSObject *obj = _delegate;
//HERE IS EXC_BAD_ACCESS
    [obj performSelectorOnMainThread:@selector(didTouchImageView:) withObject:self waitUntilDone:NO];
}

Я назначаю делегата здесь:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [invoiceTabImage setDelegate:self];
}

и вопрос в том, почему это может быть.

Ответы [ 2 ]

5 голосов
/ 15 июля 2011

EXC_BAD_ACCESS означает, что ваш делегат уже был освобожден, когда вы отправили ему сообщение didTouchImageView (я предполагаю, что когда вы отправляете сообщение performSelector, все в порядке, это будет слишком просто).

Прежде всего, проверьте управление сохранением / выпуском для вашего делегата, чтобы увидеть, есть ли что-то неправильное.

Если все кажется в порядке, одна из возможностей отладки - это включение зомби (вы можете сделать это через Инструменты / Выполнить с помощьюинструмента повышения производительности или путем установки переменной среды при отладке).

Это может помочь вам определить причину проблемы.

Если вам нужна дополнительная помощь, пожалуйста, опубликуйте код о том, как высоздайте / сохраните / освободите ваш объект делегата, а также вставьте трассировку стека сбоя.

РЕДАКТИРОВАТЬ:

Два совета:

  1. ключработа с делегатами (без их сохранения) означает, что контроллер представления (который в вашем случае также является делегатом) живет дольше, чем invoiceTabImage;Затем вы можете просмотреть жизненный цикл invoiceTabImage (когда он создан / выпущен) и сравнить его с делегатом;

  2. в dealloc вашего контроллера, добавьте эту строку:

    invoiceTabImage = nil;

    , так что вы гарантируете, что при удалении контроллера / делегата делегирующий объект знает, что делегата больше нет;программа не будет работать, но, возможно, не будет аварийно завершать работу.

1 голос
/ 19 ноября 2015

Просто проверьте, установлен ли он на ноль (именно это и сделает Deloc).

Это решило проблему для меня:

- (void)setDelegate:(id<UITableViewDelegate>)newDelegate
    {
        if (newDelegate!=nil) {
            if (newDelegate != self.collapseDelegate)
            {
                self.collapseDelegate = newDelegate;
                [super setDelegate:self.collapseDelegate?self:nil];
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...