gpt4 book ai didi

objective-c - free 和 malloc 与 NSValue 和 NSInvocation

转载 作者:行者123 更新时间:2023-12-04 02:40:14 27 4
gpt4 key购买 nike

当属性具有自定义命名的 getter 和 setter 时,我正在制作一个实用程序来获取/设置属性值。您可以在第 279 行 here 查看完整上下文.相关片段在这里:

- (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 的返回值是通过引用返回的,并且根据 the apple documentation (见底部),当 NSValue 仍然存在时,我无法释放与标量关联的内存——但我正在返回 NSValue,所以我不知道何时释放内存。

我是不是读错了文档? NSValue 是否会以某种方式自动处理这个问题?或者在这种情况下如何正确释放内存?

最佳答案

您必须释放缓冲区+valueWithBytes:objCType: 复制发送的缓冲区,这样您就可以在完成后释放缓冲区。

您还可以选择在这里使用 NSData 对象,如下所示:

NSData *data = [[NSData alloc] initWithBytesNoCopy:buffer length:length freeWhenDone:YES]; 

这意味着当 NSData 对象被释放时,您创建的缓冲区也会被释放。

证明 +valueWithBytes:objCType: 复制缓冲区:

int *buffer = malloc(sizeof(int));
buffer[0] = 50;

NSValue *value = [NSValue valueWithBytes:buffer objCType:@encode(int)];

// sribble 'buffer'
buffer[0] = 1000;
free(buffer);

int test = 1000;
[value getValue:&test];

printf("%i", test); // outputs 50

关于objective-c - free 和 malloc 与 NSValue 和 NSInvocation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9707233/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com