Это старый вопрос, но я не вижу правильного ответа, так что вот так:
Когда получено предупреждение о памяти, -didReceiveMemoryWarning
вызывается во ВСЕХ контроллерах представления, независимо от того, являются они «текущим» или нет. Контроллеры представления просто прослушивают передачу события предупреждения памяти.
Если представление контроллера представления не используется во время предупреждения о памяти, контроллер выгрузит его, установив для свойства значение nil. Как он узнает, используется ли представление? По представлению -superview
свойство. Если view.superview
равно nil, представление не является частью какого-либо дерева и может быть безопасно выгружено.
Как только это происходит, вызывается -viewDidUnload
контроллера. Это правильное место для выгрузки любых торговых точек и всего, что будет воссоздано в -viewDidLoad
.
Так для чего -didReceiveMemoryWarning
? У вашего контроллера могут быть объекты, которые не получают экземпляры до тех пор, пока к ним не будет получен доступ. Например, у вас может быть контроллер, которому иногда требуется большой кусок данных из файла, но не всегда. Вы могли бы иметь свойство, установленное для этого как это:
- (NSData*)bigChunkOfData {
// Get data from our instance variable _data, read from disk if necessary
if (_data == nil) {
_data = [[NSData alloc] initWithContentsOfFile:@"/path/to/data"];
}
return _data;
}
При первом чтении данные с диска будут сохранены в переменной экземпляра. Поскольку переменная _data
создается по требованию, мы можем безопасно выгружать ее в ситуациях нехватки памяти: она будет создана заново в следующий раз, когда она нам понадобится.
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
[_data release];
_data = nil; // <-- Very important: don't leave strong references dangling.
}