Пустая реализация drawRect вызывает предупреждение памяти

У меня есть UIView, на котором я рисую UIBezierPath пальцем. Когда я повторно масштабирую представление (скажем, после того, как нарисован путь), запускается функция перерисовки, которая изменяет масштаб BezierPath:

- (void)redrawPathsWithScale:(float)scale
{
    [_path applyTransform:CGAffineTransformMakeScale(scale, scale)];
    [self setNeedsDisplay];
}

setNeedsDisplay вызывает вызов drawRect. Теперь каждый раз, когда я увеличиваю масштаб до абсолютной шкалы где-то около x6, я сразу получаю предупреждение о памяти, и приложение вылетает.

Мой drawRect метод выглядит так:

- (void)drawRect:(CGRect)rect
{   
    [_path strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
}

Любопытно следующее: полное отсутствие реализации drawRect удаляет предупреждение о памяти. Реализация пустого drawRect по-прежнему вызывает сбой!


person Hasib. A. Samad    schedule 23.10.2012    source источник
comment
Вы пытались отследить распределение в инструментах, чтобы увидеть, что именно отвечает за рост памяти?   -  person Tobi    schedule 23.10.2012
comment
Хорошо. Прироста памяти на самом деле нет. Это очень странная проблема. Выделения (живые байты) постоянно составляют около 8 МБ, пока приложение не выйдет из строя. См. Другой мой вопрос, связанный с этой проблемой: stackoverflow.com/questions/13028427/   -  person Hasib. A. Samad    schedule 23.10.2012
comment
Я работаю над подобной вещью и обнаружил, что частота, которую вы вызываете draw rect, может вызвать предупреждение памяти и сбой. Например, если я вызываю drawRect каждые 0,25 секунды, мое приложение вылетает, но если я вызываю его каждые 0,5 секунды, все в порядке. Странное поведение мягко говоря. Вы вообще используете таймер для перерисовки?   -  person damien murphy.    schedule 02.11.2012


Ответы (1)


Имеет ли значение добавление [super drawRect:rect];?

Документация Apple для drawRect гласит:

Если вы создаете подкласс UIView напрямую, ваша реализация этого метода не требует вызова super. Однако, если вы создаете подкласс другого класса представления, вам следует вызвать super в какой-то момент вашей реализации.

Если вы создаете подкласс UIView, все будет в порядке, но, возможно, стоит проверить это на всякий случай.

person CaptainRedmuff    schedule 23.10.2012
comment
Я создаю подкласс UIView напрямую. Тем не менее, я попытался вызвать супер-метод в начале drawRect. Ничего не изменилось. - person Hasib. A. Samad; 23.10.2012
comment
Это исправило это для меня. Я создавал подкласс UIControl без super drawRect. Спасибо! - person Jon; 07.12.2012