我NSInvocation
用来获取一些方法返回,不幸的是我似乎有泄漏,但void*
在我从NSInvocation
.
在以下实现中,我尝试使用在下一个运行循环中执行的块来释放它,但由于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;