当函数返回malloc()的结果时,如何在malloc()之后释放()?

时间:2010-01-27 07:22:24

标签: iphone objective-c

我有以下实例方法(改编自iPhone应用程序编程指南中清单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个字节。我不确定如何在touchOriginPoint期间返回free()

4 个答案:

答案 0 :(得分:3)

如果您不关心次要性能损失,请使用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方法,则在不需要值时,您必须找到freemalloc个内存的位置。因此,您必须在创建字典时传递值回调

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);
...

答案 1 :(得分:1)

如果必须从函数返回malloc'd值,那么您已经将释放内存的责任交给了调用函数或其中一个调用者。

由于我们无法看到调用函数,因此我们无法再进行诊断。

答案 2 :(得分:0)

如果您要返回一个已分配的对象,那么您需要让调用者free(),否则您需要使用某种垃圾收集(因此它会自动释放)

答案 3 :(得分:0)

你实际上并没有返回一个指针,当它返回时会将值复制到临时值,所以你根本就没有真正返回分配,问题是你也没有释放它,你把分配添加到字典中,然后把它留在那里?

是否有类似EndOfTouch的功能?你从字典中删除触摸的地方?如果有,请在那里拨打免费电话,你应该没事。