Для приложения для 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, отладчик позволяет мне видеть экземпляр объекта и значения всех параметров.