2010-06-01 3 views
3

Если у меня есть установка ViewController, как показано ниже:Управление памятью & viewDidUnload?

@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> { 
    CLLocationManager *locationManager; 
} 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    locationManager = [[CLLocationManager alloc] init]; 
} 

, когда дело доходит до управления памятью я должен добавлять релиз как viewDidUnload & dealloc?

-(void)viewDidUnload { 
    [locationManager release]; 
    locationManager = nil; 
    [super viewDidUnload]; 
} 


-(void)dealloc { 
    [locationManager release]; 
    [super dealloc]; 
} 

веселит Gary

EDIT:

[супер dealloc] переместили вниз, как на деканов любезного комментарий.

+0

Только что заметили - вы должны положить [super dealloc] как строку _last_ в свой метод dealloc. В противном случае вы можете получить сбой при попытке освободить locationManager, потому что память уже может использоваться с другого объекта. (Очень маловероятно, но кое-что, чтобы следить за) – deanWombourne

+0

Спасибо, Дин, моя ошибка, но хорошая, чтобы иметь в виду, еще раз спасибо. – fuzzygoat

+0

@dean: Как память locationManager может использоваться для другого объекта, если вы еще не выпустили его? (ссылаясь на исходный код) – progrmr

ответ

6

Короткий ответ:

Если вы не создаете/удержания его в viewDidLoad (или XIb), не выпустить его в viewDidUnload.

Длинный ответ:

viewDidUnload используется, чтобы освободить все, что вы могли бы сделать, когда создается мнение - это включало вещи в viewDidLoad, но также включает в себя и IBOutlet свойства, которые создаются внутри файла XIb. все они должны быть выпущены и установлены в nil in viewDidUnload.

Все, что еще должно быть выпущено в dealloc.

Идея состоит в том, что если viewDidUnload вызывается для освобождения некоторой памяти, представление может быть полностью воссоздано полностью из метода viewDidLoad.

+0

Могу ли я уточнить ваш ответ, я создаю locationManager в viewDidload, поэтому его право выпустить его в viewDidUnload (если представление выгружается), а также право выпустить его в dealloc для ситуаций, когда приложение выходит с просмотром, все еще загруженным? – fuzzygoat

+0

Если вы создаете экземпляр в viewDidLoad, тогда да, отпустите его в viewDidUnload (при условии, что вам не нужны обновления местоположения до тех пор, пока представление не будет загружено снова!). И вы снова правы - отпустите его в dealloc :) – deanWombourne

+0

Спасибо, очень благодарен. – fuzzygoat

5

В viewDidUnload вы должны настроить свойства IBOutlet на нуль и все, что инициализировано в viewDidLoad.

Помните, что если телефон разряжен в памяти, ваше изображение будет выгружено, если оно не находится на экране. В следующий раз, когда ваше представление будет загружено снова, новые представления будут подключены к IBOutlets, и viewDidLoad будет вызван снова. Таким образом, вы должны установить свойства выхода на нуль в viewDidUnload, чтобы уменьшить площадь памяти.

0

Парень делает [выпуск объекта] перед выполнением self.object = nil;

Является ли первый релиз ни для чего? В документации Apple они просто влияют на ноль на переменную ... что правильно?

+1

Если переменные экземпляра объявлены как @property (сохранение), вы можете просто использовать [self setMyVariable: nil]; это затем отпустит старый объект и сохранит нуль. В моем примере выше я не использовал @property, следовательно, ручной выпуск и ноль. – fuzzygoat

+0

locationManager = nil не приведет к его освобождению, поскольку он работает непосредственно на иваре. Таким образом, вам нужно либо явно освободить его, либо использовать мутатор ([self setLocationManager: nil] или self.locationManager = nil), чтобы выпустить ранее сохраненное значение. Я лично предпочитаю версию в своем примере ([locationManager release], locationManager = nil), поскольку она более четко заявляет, что происходит. –

Смежные вопросы