Я только что обнаружил утечки памяти с помощью инструментов. Он утверждает, что я просочился в середине метода 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 где-то несколько месяцев назад; это работает очень хорошо (кроме выявления вышеупомянутой утечки памяти). Вы можете найти код здесь .
EDIT:
Я провел немного больше исследований и изменил код следующим образом:
- (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 не освобождает их должным образом, когда он освобожден? Все еще озадачен ...