Когда я должен выпустить объекты в - (пустой) viewDidUnload, а не в-dealloc?

Магистральный каталог является каталогом, с которым Вы являетесь, вероятно, самыми знакомыми, потому что это используется для содержания новых изменений. Ваша основная кодовая база должна быть в соединительной линии.

каталог ответвлений для содержания Ваших ответвлений, независимо от того, что они могут быть.

каталог тегов в основном для меток определенного набора файлов. Вы делаете это для вещей как выпуски, где Вы хотите "1.0" быть этими файлами в этих изменениях и "1.1", чтобы быть этими файлами в этих изменениях. Вы обычно не изменяете теги, как только они сделаны. Для получения дополнительной информации о тегах см. Глава 4. Ветвление и Слияние Управление версиями с Подрывной деятельностью ).

103
задан Peter Mortensen 23 October 2011 в 12:51
поделиться

7 ответов

В дополнение к тому, что уже было указано, я хотел подробнее рассказать о логике -viewDidUnload .

Одна из наиболее важных причин для его реализации заключается в том, что подклассы UIViewController обычно также содержат ссылки-владельцы на различные подпредставления в иерархии представлений. Эти свойства могли быть установлены с помощью IBOutlets при загрузке из пера или, например, программно внутри -loadView .

Дополнительное владение субпредставлениями UIViewController означает, что даже когда его представление удаляется из иерархии представлений и освобождается для экономии памяти, через которую подвиды также освобождаются представлением, они не будут фактически освобождены, потому что сам UIViewController по-прежнему содержит свои собственные невыполненные сохраняющие ссылки на эти объекты. Освобождение UIViewController дополнительных прав собственности на эти объекты гарантирует, что они будут освобождены, а также для освобождения памяти.

Объекты, которые вы освобождаете здесь, обычно воссоздаются и устанавливаются снова при просмотре UIViewController повторно загружается либо из пера, либо посредством реализации -loadView .

Также обратите внимание, что свойство UIViewController view имеет значение nil к моменту вызова этого метода.

51
ответ дан 24 November 2019 в 04:21
поделиться

Как сказано в документации :

Он вызывается в условиях нехватки памяти, когда контроллеру представления необходимо освободить свое представление и любые объекты, связанные с этим представлением, чтобы освободить вверх памяти.

В той же ситуации dealloc вызывается , а не . Этот метод доступен только в OS3 и выше. Разобраться с той же ситуацией в iPhone OS 2.x было настоящей головной болью!

Обновление от июля 2015 г. : следует отметить, что viewDidUnload устарел в iOS 6, потому что «Просмотры больше не удаляются. в условиях нехватки памяти, поэтому этот метод никогда не вызывается ". Поэтому современный совет - не беспокоиться об этом и использовать dealloc .

21
ответ дан 24 November 2019 в 04:21
поделиться

Помните, что viewDidUnload - это метод в контроллере представления, а не в представлении. Метод dealloc представления будет вызван при выгрузке представления, но метод dealloc контроллера представления может быть вызван позже.

Если вы получите предупреждение о нехватке памяти и ваше представление не отображается, что может произойти, например, каждый раз, когда вы используете UIImagePickerController, чтобы позволить пользователю сделать снимок, ваше представление будет выгружено, и после этого его необходимо будет перезагрузить.

8
ответ дан 24 November 2019 в 04:21
поделиться

если вы посмотрите на угловой круг, вы увидите, что есть 2 противоположных «угла», которые соответствуют вашему «среднему».

Таким образом, 185 ° и 5 ° равны правильно.

Но вы упомянули более близкое среднее . Поэтому в этом случае вы можете выбрать более близкий угол.

Обычно «среднее» значение углов относится к направлению против часовой стрелки. «Среднее» не то же самое, если вы переключите два угла (или если вы используете направление по часовой стрелке).

Например, при a = 20 ° и b = 350 ° , вы ищете угол, который следует за a и перед b в направлении против часовой стрелки , 185 ° - вот ответ.

3
ответ дан 24 November 2019 в 04:21
поделиться

Заключение:

Контроллеры представления имеют свойство представления. Обычно перо или фрагмент кода добавляют к этому представлению другие представления. Это часто случается внутри метода -viewDidLoad, например:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self createManyViewsAndAddThemToSelfDotView];
}

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

В iPhone OS 2.2, когда -didReceiveMemoryWarning был вызван из системы , вам пришлось что-то выпустить, чтобы освободить память. Вы могли бы освободить представление всего контроллера представления, если это имело смысл. Или просто большое содержимое, потребляющее память.

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
}

Теперь в новой ОС 3.0 есть метод -viewDidUnload, который будет вызываться из системы, когда представление было выгружено из-за нехватки памяти (пожалуйста, поправьте меня: когда именно это вызывается?)

-viewDidUnload используется для освобождения всех объектов, которые принадлежали как самому контроллеру представления, так и представлению. Причина: если контроллер представления содержит ссылки на дочерние элементы представления, то есть кнопку, дочерние представления, на которые ссылаются, не будут освобождены, потому что их счетчик удержания> = 1. После того, как они были освобождены в -viewDidUnload, они могут быть освобождены. по памяти.

6
ответ дан 24 November 2019 в 04:21
поделиться

Это потому, что вы обычно устанавливаете @property как "(nonatomic, retain)" и поэтому сеттер, созданный для вас, освобождает текущий объект, а затем сохраняет аргумент, т.е.

self.property = nil;

... делает что-то вроде:

[property release];
property = [nil retain];

Таким образом, вы убиваете двух зайцев одним выстрелом: управление памятью (освобождение существующего объекта) и присвоение указателю значения nil (поскольку отправка любого сообщения указателю nil вернет nil).

Надеюсь, это поможет.

9
ответ дан 24 November 2019 в 04:21
поделиться

Если контроллер представления выскочил из стека контроллеров навигации и больше нигде не сохраняется, он будет деаллоцирован, и dealloc будет вызван вместо viewDidUnload. Вы должны освободить представления, созданные в loadView, в dealloc, но нет необходимости устанавливать переменные в nil, потому что вскоре после вызова dealloc переменные перестанут существовать.

5
ответ дан 24 November 2019 в 04:21
поделиться