4

を使用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;
4

1 に答える 1