我正在使用Instruments跟踪一些内存泄漏。它声称我在drawRect方法中间泄漏。这是代码:
- (void)drawRect:(CGRect)rect {
if (highColor && lowColor) {
// Set the colors for the gradient to the two colors specified for high and low
// The next line is allegedly leaking
[gradientLayer setColors:[NSArray arrayWithObjects:(id)[highColor CGColor], (id)[lowColor CGColor], nil]];
gradientLayer.startPoint = CGPointMake(0.5, 0.2);
}
[super drawRect:rect];
}
我在iPad上,所以我必须自己管理内存(也就是说,没有垃圾回收)。有谁能看到这里有什么问题?我的理解是我不必释放数组,也不必释放CGColors。此外,仪器中是否有任何方法可以找出泄漏的物体类型,即。是指NSArray还是CGColors?
非常感谢任何帮助。谢谢。
PS:几个月前我从某个地方获得了GradientView的代码;它工作得很好(除了暴露上述内存泄漏)。您可以找到代码here。
编辑:
我做了一些研究并重构了我的代码如下:
- (void)drawRect:(CGRect)rect {
if (highColor && lowColor) {
// The following two lines are leaking
CGColorRef highCGColor = [highColor CGColor];
CGColorRef lowCGColor = [lowColor CGColor];
// Set the colors for the gradient to the two colors specified for high and low
[gradientLayer setColors:[NSArray arrayWithObjects:(id)highCGColor, (id)lowCGColor, nil]];
gradientLayer.startPoint = CGPointMake(0.5, 0.2);
CGColorRelease(highCGColor);
CGColorRelease(lowCGColor);
}
[super drawRect:rect];
}
然而,我无法弄清楚为什么两个CGColors仍然在泄漏。我在方法结束时发布它们。 NSArray在解除分配时是否可能无法正确释放它们?仍然困惑......
答案 0 :(得分:0)
我不是iphone / ipad上的内存管理专家,但我会这样做: 尝试在你的if中使用NSAutoreleasepool,然后池处理内存管理,所以你必须:
if...
NSAutoreleasePool *mypool=[[NSAutoreleasePool alloc]init];
...
[mypool drain];
尝试一下,看看是否还有泄漏,但记住不要删除你释放颜色的2行。
答案 1 :(得分:0)
你的UIView中如何声明highColor和lowColor?它们是否被适当释放/自动释放?您对gradientLayer对象的声明如何正确发布?这是我在一个阶段用来在UIView上创建渐变的一些代码。它不是使用图层,而是直接绘制到当前上下文中。也许它可能会有所帮助:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGGradientRef myGradient;
CGColorSpaceRef myColorSpace;
size_t num_locations = 3;
CGFloat locations[3] = {0.0, 0.5, 1.0};
CGFloat components[12] = {0.855, 0.749, 0.196, 1.0,
0.973, 0.933, 0.267, 1.0,
0.855, 0.749, 0.196, 1.0};
myColorSpace = CGColorSpaceCreateDeviceRGB();
myGradient = CGGradientCreateWithColorComponents(myColorSpace, components, locations, num_locations);
CGPoint myStartPoint, myEndPoint;
myEndPoint.x = self.bounds.size.width;
CGContextDrawLinearGradient(context, myGradient, myStartPoint, myEndPoint, 0);
CGColorSpaceRelease(myColorSpace);
CGGradientRelease(myGradient);
}
答案 2 :(得分:0)
你不应该发布highCGColor和lowCGColor。