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