Опитвам се да изпратя блок като аргумент към метод, извикан от NSInvocation (който за контекст се задейства от NSInvocationOperation). Извикването трябва да запазва аргументите и изглежда работи за "обикновените" параметри на обекта, но retainCount на блока остава на 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];
}