Безопасный способ получить доступ к объектам NSOperation из основного потока? - PullRequest
1 голос
/ 05 июня 2011

NSOperation имеет делегата в главном потоке, который вызывается для некоторых событий, которые происходят во время выполнения NSOperation.

Затем делегат получает доступ к свойствам NSOperation для получения подробной информации.

Я обеспокоен этим крайним случаем: что если NSOperation освобождается из очереди через наносекунду после вызова делегата?Я боюсь, что внезапно все объекты могут исчезнуть из-за выпуска -dealloc в NSOperation, а затем я получаю EXC_BAD_ACCESS в главном потоке.

Как вы можете предотвратить это?Я думал о том, чтобы сделать что-то подобное в NSOperation, которое работает в фоновом режиме:

[(NSObject*)self.delegate performSelectorOnMainThread:@selector(operationUpdatedStatus:) withObject:[[self retain] autorelease] waitUntilDone:NO];

Но я думаю, что это чепуха, потому что пул авто-релизов также мгновенно сливается, так как он локальный для NSOperation.

Таким образом, чтобы быть уверенным, я должен сохранить NSOperation в методе делегата в Основном потоке, как это?

- (void)operationUpdatedStatus:(NSOperation*)op {
    [op retain]; // now we're safe to use it

    NSMutableArray *errorMessages = op.errors;
    for (NSString *errorMessage in errorMessages) {
        // lots of code
    }

    [op release];
}

Или гарантируется, что объект NSOperation не будет уничтожен, пока цикл выполненияОсновная нить заканчивается?

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Согласно документ NSObject , performSelectorOnMainThread сохраняет цель селектора, а также объект, переданный через withObject;ни один из них не освобождается до тех пор, пока не будет завершен селектор, который должен быть выполнен.Так что ваш [[self retain] autorelease] там избыточен.

1 голос
/ 07 июня 2011

Сейчас я делаю очень похожий тип кодирования в NSOperation. Я добавляю операцию в очередь, но поскольку я знаю, что операция скоро уйдет, я передаю все необходимые значения вызывающему классу через объект в делегате. Большую часть времени я использую NSDictionary, чтобы сделать это, если это более 1 объекта. У меня никогда не было проблем с освобожденными экземплярами, использующими этот метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...