を使用NSInvocation
していくつかのメソッドの戻り値を取得していますが、残念ながらリークがあるようですが、void*
から返された後、割り当てている を解放する方法がわかりませんNSInvocation
。
次の実装では、次の実行ループで実行されるブロックで解放しようとしましたが、returnBuffer
割り当てられていないためにクラッシュします。
ブロックを解放できないのはなぜですか?returnBuffer
また、割り当てられていない場合、ブロックが通過するのはなぜreturnBuffer!=NULL
ですか?
これはIMP
スウィズリングに関係する特別なメソッドなので、メソッドの戻り値の型はわかりません。入れ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;
ANSWER
Joshの-[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;