gpt4 book ai didi

iphone - 当函数返回 malloc() 的结果时,如何在 malloc() 之后 free() ?

转载 作者:行者123 更新时间:2023-12-03 20:49:30 26 4
gpt4 key购买 nike

我有以下实例方法(改编自 iPhone 应用程序编程指南中事件处理部分的 list 3-6):

- (CGPoint)originOfTouch:(UITouch *)touch
{
CGPoint *touchOriginPoint = (CGPoint *)CFDictionaryGetValue(touchOriginPoints, touch);
if (touchOriginPoint == NULL)
{
touchOriginPoint = (CGPoint *)malloc(sizeof(CGPoint)); // leaks
CFDictionarySetValue(touchOriginPoints, touch, touchOriginPoint);
*touchOriginPoint = [touch locationInView:touch.view];
}
return *touchOriginPoint;
}

每隔一段时间,我的应用程序就会因调用 malloc() 而泄漏 16 个字节。我不确定如何在 free() 时返回 touchOriginPoint

最佳答案

如果您不关心轻微性能损失,请使用NSMutableDictionary并将点存储为NSValue:

NSValue* touchOriginPointValue = [touchOriginPoints objectForKey:touch];
if (touchOriginPointValue == nil) {
touchOriginPointValue = [NSValue valueWithCGPoint:[touch locationInView:touch.view]];
[touchOriginPoints setObject:touchOriginPointValue forKey:touch];
}
return [touchOriginPointValue CGPointValue];
<小时/>

如果您必须使用CFDictionary方法,则必须找到一个地方来释放那些在值不存在时malloc分配的内存。需要。因此,创建字典时必须传递值回调

static void free_malloced_memory (CFAllocatorRef allocator, const void *value) {
free((void*)value);
}
static const CFDictionaryValueCallBacks values_callbacks = {0, NULL, free_malloced_memory, NULL, NULL};
...
touchOriginPoints = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, & values_callbacks);
...

关于iphone - 当函数返回 malloc() 的结果时,如何在 malloc() 之后 free() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145152/

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