Я использую NSInvocation
, чтобы получить какой-либо метод, и, к сожалению, у меня, похоже, есть утечка, но я не могу понять, как освободить void*
. m выделения, после того как я вернул его с NSInvocation
.Использование NSOperationQueue для отложенного без malloc'd void * после его возврата
В следующей реализации я попытался освободить его блоком, который будет выполняться в следующем цикле выполнения, но я получаю сбой из-за того, что returnBuffer
не выделяется.
Почему я не могу освободить returnBuffer
в блоке, и если он не был выделен, почему он проходит через returnBuffer!=NULL
?
Это специальный метод, связанный с IMP
swizzling, поэтому я НЕ знаю тип возвращаемого метода. Поместите его в NSData
или что-то не получится.
NSUInteger length = [[invocation methodSignature] methodReturnLength];
if(length!=0){
void* returnBuffer = (void *)malloc(length);
[invocation getReturnValue:&returnBuffer];
if(returnBuffer!=NULL){
void(^delayedFree)(void) = ^{ free(returnBuffer); };
[[NSOperationQueue mainQueue] addOperationWithBlock:delayedFree];
}
return returnBuffer;
}
return nil;
ОТВЕТ Понял работать следующим образом благодаря -[NSMutableData mutableBytes]
трюка Джоша
NSUInteger length = [[invocation methodSignature] methodReturnLength];
if(length!=0){
NSMutableData * dat = [[NSMutableData alloc] initWithLength:length];
void* returnBuffer = [dat mutableBytes];
[invocation getReturnValue:&returnBuffer];
void(^delayedFree)(void) = ^{ [dat release]; };
[[NSOperationQueue mainQueue] addOperationWithBlock:delayedFree];
return returnBuffer;
}
return nil;
Dat release tho. – immibis