我有以下实例方法(改编自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()
。
答案 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
方法,则在不需要值时,您必须找到free
个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);
...
答案 1 :(得分:1)
如果必须从函数返回malloc'd值,那么您已经将释放内存的责任交给了调用函数或其中一个调用者。
由于我们无法看到调用函数,因此我们无法再进行诊断。
答案 2 :(得分:0)
如果您要返回一个已分配的对象,那么您需要让调用者free()
,否则您需要使用某种垃圾收集(因此它会自动释放)
答案 3 :(得分:0)
你实际上并没有返回一个指针,当它返回时会将值复制到临时值,所以你根本就没有真正返回分配,问题是你也没有释放它,你把分配添加到字典中,然后把它留在那里?
是否有类似EndOfTouch的功能?你从字典中删除触摸的地方?如果有,请在那里拨打免费电话,你应该没事。