私はNSInvocation
を使用してメソッドの戻り値を取得していますが、残念ながら私はリークがあるようですが、私がNSInvocation
から戻った後、私は割り当てています。NSOperationQueueを使用すると、返された後にmalloc'd void *が返された後に返されます
次の実装では、次の実行ループで実行されるブロックで解放しようとしましたが、割り当てられていない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 はジョシュの-[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リリースtho。 – immibis