2009-07-08 2 views
1

Я пишу приложение, которое довольно графически тяжело, и поэтому я пытаюсь реализовать механизм кэширования в моем контроллере представления, который создает представление один раз и сохраняет его для будущего использования , похожее на следующее:Управление объектной памятью: элементы кеширования

- (UIView *)logoView 
{ 
    if(_logoView == nil) 
    { 
     _logoView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"logo_header.png"]]; 
     _logoView.contentMode = UIViewContentModeCenter; 
    } 

    return _logoView; 
} 

Это все работает изумительно, однако, я получаю немного запутался по определенному вопросу; когда я моделировать предупреждение памяти я называю метод, который очищает кэш, например, так:

- (void)purgeCachedContent 
{ 
    if(_logoView != nil)[_logoView release]; 
} 

Однако, это, кажется, вызывает мои вопросы применения, так как он может вызываться несколько раз (dealloc, didReceiveMemoryWarning и viewDidUnload) ,

Как определить, существует ли экземпляр для отправки сообщения о выпуске? Даже когда я пытаюсь загрузить NSLog, я получаю ошибку EXC_BAD_ACCESS, поэтому мне трудно понять, как это сделать. Я даже удалил оператор if, надеясь полагаться на возможность отправлять сообщения с ноль-объектами, но это вызывает ту же ошибку ...

Я уверен, что это что-то простое из-за моего объективного знания ... Я просто не знаю, что!

ответ

3

_logoView не устанавливается автоматически, просто освобождая его, поэтому любые будущие методы, которые вы пытаетесь вызвать с помощью этого указателя, перейдут в ячейку памяти, которая использовала для хранения действительного объекта, но теперь содержит мусор. Вы можете исправить это, установив _logoView = nil; после его выпуска.

0

Если вы хотите кэшировать его, почему вы хотите его выпустить?

просто использовать autorelease на INIT:

_logoView = [[[UIImageView alloc] initWithImage: [UIImage imageNamed: @"logo_header.png"]] autorelease]; 
Смежные вопросы