일부 메소드가 반환되기 때문에 불행히도 누수가있는 것처럼 보이지만 해제하는 방법을 알아낼 수 없습니다. void*
' 할당 후, 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;
는 당신은 void *
NSMutableData
에서, 당신이 malloc()
에서 할 수처럼를 얻을 수 있습니다 조쉬의 -[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