Конструирайте NSInvocation с аргумент Block

Опитвам се да изпратя блок като аргумент към метод, извикан от 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];
}

person Ben Mosher    schedule 25.07.2011    source източник
comment
Откъде получавате completionBlock? Получавате ли го с помощта на getArgument:atIndex:?   -  person pshah    schedule 10.07.2013


Отговори (1)


Не извиквайте `retainCount`; безполезно е.

Без да видите съдържанието на вашия блок, е невъзможно да се каже. Ако блокът ви всъщност е статичен блок, копирането му не прави нищо.

Виждате ли катастрофа?

person bbum    schedule 25.07.2011
comment
Виждах срив, ако не копирах блока (вероятно защото беше разпределен в стека и беше изчистен преди извикването). Въпреки това, както се оказа, той НЕ се срива, ако освободя блока callback. Нито Leaks съобщава, че блоковете текат или нещо друго. Изглежда, че просто премислях. - person Ben Mosher; 27.07.2011
comment
Добавих моята дефиниция на блок към въпроса. Освен това благодаря за помощта! - person Ben Mosher; 27.07.2011