У меня проблема с выделением памяти (в любом случае, нет утечки).
В моей программе есть пользовательский 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, является приведенной выше.