为什么会发生这种泄漏?
我非常不喜欢问一个非常具体的问题,也不太可能帮助很多其他人,但经过几个小时的挠头,我别无选择。
泄漏工具报告说,以下代码有泄漏:
- (void)likeABarrelFullOfHoles
{
UIGraphicsBeginImageContextWithOptions(CGSizeMake(50.0f, 50.0f), YES, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGLayerRef *shapeLayers = malloc(3 * sizeof(*shapeLayers));
for (int i = 0; i < 3; i++)
{
// Leak culprit.
shapeLayers[i] = CGLayerCreateWithContext(context, CGSizeMake(5.0f, 5.0f), NULL);
}
for (int i = 0; i < 3; i++) {
free(shapeLayers[i]);
}
free(shapeLayers);
UIGraphicsEndImageContext();
}具体来说,它报告说,CGLayerCreateWithContext函数是问题所在,但它泄漏的是CGContext对象,而不是CGLayer对象,它将返回这些对象:


我毫不怀疑,我的问题是由于对内存管理/动态分配缺乏基本的理解,而且有人会用“您应该知道这个”的方法指责我,因为下面的代码似乎没有泄漏:
- (void)noLeaks
{
UIGraphicsBeginImageContextWithOptions(CGSizeMake(50.0f, 50.0f), YES, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGLayerRef shapeLayer = CGLayerCreateWithContext(context, CGSizeMake(5.0f, 5.0f), NULL);
CGLayerRelease(shapeLayer);
UIGraphicsEndImageContext();
}请注意,这显然是问题的最简单的再现状态。我使用动态内存分配,因为在我的实际代码中,数组的大小在编译时不知道。
发布于 2013-03-26 21:01:56
我无法告诉您,为什么仪器报告CGContext对象正在泄漏,而不是CGLayer,而是用
shapeLayers[i] = CGLayerCreateWithContext(context, CGSizeMake(5.0f, 5.0f), NULL);一定要放出来
CGLayerRelease(shapeLayers[i]); 而不是和
free(shapeLayers[i]); CGLayerCreateWithContext不是malloc,因此为该对象调用free会导致内存损坏。
https://stackoverflow.com/questions/15647195
复制相似问题