NSOperation вызывает сбой при передаче делегировать - PullRequest
1 голос
/ 01 июня 2010

Для приложения для iPhone я использую NSOperationQueue, чтобы ограничить доступ к базе данных SQLite одним запросом за раз. Я создал подкласс NSOperation и в основной функции у меня есть следующее:

- (void)main
{    
    // ... other code here ...

    if( [_delegate respondsToSelector:@selector(queryCompleted:)] )
    {
        [_delegate performSelectorOnMainThread:@selector(queryCompleted:) 
                                    withObject:self
                                 waitUntilDone:NO];
    }
}

Делегатская сторона:

- (void)queryCompleted:(QueryOperation*)aQueryOperation
{
     // Breakpoint here allows me to explore and see the members of aQueryOperation

     id results = [aQueryOperation resultSet]; // Crashes here

     // ... more code here ...
}

Причина, по которой я передаю self, состоит в том, чтобы разрешить делегату получить доступ к идентификатору для операции запроса (в случае, когда на одного делегата открыто более одного запроса) и к результатам запроса.

В документации для <a href="http://developer.apple.com/mac/library/documentation/cocoa/reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/performSelectorOnMainThread:withObject:waitUntilDone:" rel="nofollow noreferrer">performSelectorOnMainThread:withObject:waitUntilDone:</a> четко указано:

"Этот метод сохраняет приемник и параметр arg до тех пор, пока не будет выполнен селектор."

Однако, когда метод делегата пытается получить доступ к аргументу, возникает исключение «EXC_BAD_ACCESS». Есть мысли о том, почему?

Как ни странно, если я устанавливаю точку останова до сбойной ссылки на объект NSOperation, отладчик позволяет мне видеть экземпляр объекта и значения всех параметров.

1 Ответ

0 голосов
/ 02 июня 2010

Попробуйте установить для параметра waitUntilDone: значение YES. Возможно, существует состояние гонки, которое позволяет NSOperation освободить себя.

...