viewDidUnload
можно рассматривать как противоположность viewDidLoad
. Он вызывается в случаях, когда представление выгружается из-за предупреждений памяти, но контроллер представления фактически не освобождается.
Позволяет освободить память, которая имеет отношение только к загрузке представления, и, следовательно, позволяет освободить память в этих условиях нехватки памяти.
Что касается разницы между двумя выпусками, один использует self
, а другой нет:
В методе viewDidUnload
переменная устанавливается на nil
с помощью методов доступа. Переменная была объявлена как свойство, вероятно, с атрибутом retain
. При назначении nil
через свойство, оно функционально совпадает со следующим кодом:
- (void)setMyObject:(MyObject *)object
{
[myObject release];
myObject = [object retain];
}
Итак, если вы передадите nil
этому методу, вы освободите старый экземпляр и присвойте переменной значение nil. Назначение nil после освобождения считается хорошей практикой, чтобы предотвратить любую возможность разыменования висящего указателя .
В методе dealloc
доступ к переменной осуществляется напрямую, а не через метод доступа или свойство, и освобождается. На самом деле нет нужды назначать nil в этой точке, потому что объект-владелец будет освобожден и не будет иметь доступа ни к одному из его указателей, что делает возможность разыменования висящего указателя очень низкой.