NSDate проблема с памятью (снова) - PullRequest
1 голос
/ 26 апреля 2010

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

Сохраненный объект NSDate, который раньше работал нормально, внезапно, кажется, освобождает себя, вызывая сбой, когда NSMutableString пытается добавить свое описание (теперь 'nil').

Построить и проанализировать не сообщает о потенциальных проблемах.

Упрощенно, код выглядит так:

NSDate* aDate

-(id)init
{
    aDate = [[NSDate date] retain]
    return self;
}

-(void)drawRect(CGRect)rect
{
    NSMutableString* stringy = [[NSMutableString alloc] init];

    //aDate is now deallocated and pointing at 0x0?
    [stringy appendString:[aDate description]]; //Crash
}

Я должен подчеркнуть, что реальный код намного сложнее, с отдельным потоком, который также обращается к объекту даты, однако существуют подходящие блокировки, и при пошаговом выполнении кода [aDate release] нигде не вызывается.

Использование [[NSDate alloc] init] имеет тот же эффект. Я также должен добавить, что init - это первая вызываемая функция.

Может кто-нибудь предложить что-то, что я, возможно, упустил из виду, или почему объект NSDate (или кажется) высвобождает себя?

Ответы [ 3 ]

1 голос
/ 26 апреля 2010

Попробуйте использовать aDate как поле объекта, а не как глобальный экземпляр. Также используйте метод инициализации по умолчанию.

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame])
       aDate = [[NSDate date] retain]
    }
    return self;
}
0 голосов
/ 26 апреля 2010

Полагаю, тот факт, что у вас есть метод drawRect:, означает, что вы создаете подкласс NSView или, возможно, UIView. Ни в одном из случаев им никогда не отправляется сообщение инициализации. Они всегда инициализируются с помощью initWithFrame: или initWithCoder: (initWithCoder: используется для создания экземпляра представления из файла пера). Вам нужно переопределить оба этих метода или - поскольку у вас есть только один глобальный экземпляр aDate - вы должны реализовать + initialize

+(void) initialize
{
    if (aDate == nil)
    {
        aDate = [[NSDate date] retain];
    }
}
0 голосов
/ 26 апреля 2010

не проверено. но не будет ли это намного проще, изменив:

[stringy appendString:[aDate description]];

до

[stringy appendString:[[NSDate date] description]];

и пропустить все эти вещи NSDate?

...