Построить NSInvocation с аргументом Block

Я пытаюсь отправить блок в качестве аргумента методу, вызываемому NSInvocation (который для контекста запускается NSInvocationOperation). Вызов должен сохранять аргументы, и, похоже, он работает для «обычных» параметров объекта, но для блока keepCount остается значение 1.

Я мог бы освободить его после того, как он будет использован в вызове метода, но теоретически это может привести к его утечке, если очередь растворится до вызова операции.

Некоторый код:

NSInvocationOperation *load = [[NSInvocationOperation alloc] initWithInvocation:loadInvoc];
NSAssert([loadInvoc argumentsRetained],@"Arguments have not been retained");
[loader release];

NSInvocation *completionInvoc = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(serviceCompletionBlock:afterInvocationCompleted:)]];
[completionInvoc setTarget:self];
[completionInvoc setSelector:@selector(serviceCompletionBlock:afterInvocationCompleted:)];

MFEImageCallback callback = [completionBlock copy];

[completionInvoc setArgument:&callback atIndex:2];
[completionInvoc setArgument:&load atIndex:3];

NSInvocationOperation *completion = [[NSInvocationOperation alloc] initWithInvocation:completionInvoc];
NSAssert([completionInvoc argumentsRetained],@"Completion handler not retaining");
[callback release];
[completion addDependency:load];

Блок, который я использую (определен в методе доступа для подкласса NSManagedObject):

^(UIImage *image,NSError *err){
    [self setValue:image forKey:key];
}

person Ben Mosher    schedule 25.07.2011    source источник
comment
Откуда вы получаете блок завершения? Вы получаете это, используя getArgument:atIndex:?   -  person pshah    schedule 10.07.2013


Ответы (1)


Не вызывайте `retainCount`; это бесполезно.

Не видя содержимого вашего блока, сказать невозможно. Если ваш блок фактически является статическим блоком, то его копирование ничего не даст.

Вы видите аварию?

person bbum    schedule 25.07.2011
comment
Я видел сбой, если я не скопировал блок (предположительно, потому что он был выделен в стек и очищен перед вызовом). Однако, как выясняется, он НЕ падает, если я отпускаю блок callback. Утечки также не сообщают, что блоки протекают или что-то еще. Похоже, я просто слишком много думал. - person Ben Mosher; 27.07.2011
comment
Добавил определение моего блока в вопрос. Кроме того, спасибо за вашу помощь! - person Ben Mosher; 27.07.2011