我正在制作一个实用程序,用于在属性具有自定义命名的getter和setter时获取/设置属性值。您可以在279行 这里看到完整的上下文。相关的代码片段如下:
- (id) getFrom:(id) object {
NSMethodSignature *methodSig = [[object class] instanceMethodSignatureForSelector:[self getter]];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:methodSig];
[inv setSelector:[self getter]];
[inv setTarget:object];
[inv invoke];
if ([self isObject]) {
id returnValue;
[inv getReturnValue:&returnValue];
return returnValue;
} else {
void *buffer;
NSUInteger length = [methodSig methodReturnLength];
buffer = (void *)malloc(length);
[inv getReturnValue:buffer];
NSValue *value = [NSValue valueWithBytes:buffer objCType:[methodSig methodReturnType]];
//FIXME: Memory leak for buffer! But if we free it, [value getValue:] is a dangling pointer.
//free(buffer)
return value;
}
}
问题是当属性是标量时,我想返回一个NSValue(类似于键值编码)。然而,NSInvocation的返回值是通过引用返回的,并且根据苹果文档(请参见底部的链接),我不能在NSValue仍然存在时释放与标量相关联的内存--但我正在返回NSValue,所以我不知道何时释放内存。
我是否错误阅读了文档?NSValue是否自动处理这个问题?或者在这种情况下如何正确地释放内存?