Вызов блока из внутреннего блока - PullRequest
2 голосов
/ 02 января 2012

У меня есть класс Cocoa / Objective-C с методом, который выглядит примерно так:

- (void)doWork:(void (^)(void))handler
{
    [self->someObject doActualWork:kWorkID handler:^(Result *result) {
        if (handler)
            handler();
    }];
}

Однако, когда внутренний блок с именем handler был освобожден, и программа падает, когда онназывается.Насколько я понимаю, это потому, что блок хранится в стеке и, таким образом, удаляется вскоре после завершения doWork:.Я использую ARC.Что я должен сделать, чтобы это исправить?

1 Ответ

4 голосов
/ 02 января 2012

Во-первых, self-> для доступа к iVar - это, как правило, странный и обескураженный шаблон.

Скопировали ли вы блоки до того, как сохранить их для дальнейшего использования? Если предполагается, что это асинхронный код, то ваш метод actualWork:handler: должен копировать блок перед его постановкой в ​​очередь.

Даже под ARC; в то время как ARC обрабатывает возврат блоков из методов автоматически, он не может обрабатывать блоки как аргументы автоматически, и вам все равно нужно их скопировать.

Если это чисто синхронный код, значит что-то не так. Вам нужно будет предоставить больше подсказок.

...