Cocoa: CALayer: непрерывная перерисовка представления постоянно увеличивает выделенную память - PullRequest
0 голосов
/ 21 февраля 2011

У меня проблема с выделением памяти (в любом случае, нет утечки).

В моей программе есть пользовательский Window с пользовательским View, содержащим TextField, ImageView и Shadow.Допустим, что каждую 1 секунду я программно обновляю значение TextField, используя [myTextField setStringValue:@"actual string"].

Очевидно, что каждый раз, когда TextField изменяется, представление перерисовывается.

Если я смотрюв Activity Monitor я вижу, что каждый раз, когда TextField обновляется, и, следовательно, представление перерисовывается, выделенная память увеличивается.ImageView не должен меняться. Если я прокомментирую строку с setStringValue, программа запустится без увеличения объема памяти. (См. Обновление 4).

Обратите внимание, что Instruments не сообщает об утечке памяти или невыпущенном объекте.и View - это autorelease 'd.

Что может вызвать это?

UPDATE

Выкладываю упрощенную версию фактического кода:

.h

CustomTextField *myTextField;
int level;

@interface Dummy : NSObject {

NSString *level_string;
NSTimer *timer;

}

@end

.m

@implementation Dummy

- (void)awakeFromNib
{
// ...
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                                                  target:self 
                                                selector:@selector(changestring:) 
                                                userInfo:nil
                                                 repeats:YES];

// ...

}


-(void)changestring:(NSTimer *)timer
{
        level++;
        level_string = [[NSString alloc] initWithFormat:@"%i",level];
        [myTextField setStringValue:level_string];
        [level_string release];

}

Где CustomTextField - класс NSTextField.

Я не знаю, есливажно то, что я собираюсь добавить, в любом случае пользовательское окно, пользовательское представление и пользовательское текстовое поле определены и init программно в коде, и они не создаются в конструкторе интерфейса.

ОБНОВЛЕНИЕ 2

Я был не прав!Даже если я прокомментирую setStringValue, память все равно увеличивается ... намного меньше, но все равно увеличивается ... Странный факт: инструменты в любом случае сообщают о размере "живого объекта", который остается постоянным, и об утечках не сообщается.

Что происходит?

ОБНОВЛЕНИЕ 3

Я только что использовал потрясающую функцию кучи инструментов, и это результат.

Увеличение памяти, которое я вижу в мониторе активности (который составляет порядка нескольких тысяч килобайт через несколько минут), откуда оно берется?

ОБНОВЛЕНИЕ 4

Мне кажется, я нашел причину проблемы, но не могу ее решить.

В представлении есть TextField, ImageView и Shadow.Чтобы они правильно отображались на экране без глюков, я добавил [view setWantsLayer:YES].Если я прокомментирую эту строку, проблема выделения памяти определенно решена.

Теперь, если мне нужно использовать эту команду, как я могу это сделать?Я должен выпустить что-то связанное с Core Animation?Обратите внимание, что единственная команда, связанная с Core Animation, является приведенной выше.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Взгляните на сессию 311 - Расширенный анализ памяти с помощью инструментов видео сеансов WWDC10. Как скачать эти видео можно найти здесь .

Возможно, вы видите заброшенную память или происходит какое-то кеширование. Что происходит, если вы запускаете предупреждение о нехватке памяти в симуляторе? Уходит память?

Также попробуйте использовать функцию heapshot в Instruments: сделать heapshot, обновить строку и показать, какие объекты были созданы. В видео сеанса, упомянутого выше, демонстрируется процедура.

РЕДАКТИРОВАТЬ: Что я забыл: если вы не можете понять, что происходит, и вы можете показать это поведение увеличения выделения памяти, не освобождая его, если в простом примере приложения выдается предупреждение о нехватке памяти, сообщите об ошибке на Apple bugreporter отправка в этом примере проекта и файл трассировки инструментов, чтобы показать, что происходит.

РЕДАКТИРОВАТЬ2: Я ошибался, предполагая, что эта проблема была в Mac OS X. Те же принципы применимы и к приложению Mac OS X. Управление памятью в Какао практически одинаково на iPhone и Mac. Самая большая разница в том, что на Mac доступна сборка мусора. Конечно, на Mac нет предупреждений о нехватке памяти, так что оставьте это.

0 голосов
/ 21 февраля 2011

Что делает setStringValue: в CustomTextField? Я предполагаю, что вы сохраняете переданную строку без освобождения старого значения в вашем установщике.

...