Какие атрибуты выпустить, а какие нет? - PullRequest
0 голосов
/ 11 сентября 2011

В моем приложении я определяю некоторые атрибуты в моем h-файле.

Насколько я понимаю, если есть атрибуты, которые получают "alloc" где-то в файле m, я должен выпустить его в методе dealloc (или раньше, если он больше не актуален).

Мне неясно, какие атрибуты не получают "alloc":

  • NSString - следует ли мне их освобождать (я читаю посты, которые говорят "да", и постычто сказать "нет")
  • NSDictionary / NSArray - при их создании я не использую "alloc", но некоторые методы arrayWith или dictionaryWith;получают ли они выделение памяти, требующее освобождения, или я могу предположить, что XCode заботится об управлении своими данными?
  • BOOL - просто хочу убедиться, что мне не нужно их освобождать
  • int - просто хочу убедиться, что мне не нужно выпускать их
  • элементов пользовательского интерфейса (например, UIButton, UILabel и т. Д. ...) - эти элементы связаны в IB, у меня нет «alloc» из кода - IB их освобождает или я должен это сделать сам?
  • Как атрибут Пропорциональный влияет на требования к управлению памятью?copy / retain / assign / nonatomic (я понимаю, что когда я «копирую», я создаю другую копию и, следовательно, возможно выделяю больше памяти, но я видел примеры кодов, которые в некоторых случаях освобождают скопированные свойства, а в некоторых - нет)

Я не возражаю читать другой учебник (в большинстве случаев, когда я задаю вопрос об управлении памятью, люди посылают мне ссылку на Руководство по управлению памятью Apple), но если кто-то может это объяснитьили я могу обратиться к более яркому / ясному учебнику, чем тот, который предлагает Apple, я был бы очень признателен.

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

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

Самое полезное объяснение по управлению памятью Какао, которое я прочитал, было в книге Хиллегаса (Программирование Какао для Mac OS X), где он описал объект как собаку. Каждый раз, когда вы используете один из методов, увеличивающих количество сохраняемых данных (new, copy, retain, init, некоторые из которых я наверняка забыл, они есть в руководстве по управлению памятью, которое вы уже использовали. прочитайте) затем вы кладете еще один поводок на шею собаки .

Теперь я перенесу эту совершенно хорошую метафору на глупые крайности. Вы просили яркий пример!

  • Вы должны снять любую из ваших отведений от собаки, как только вы закончите с ней. В противном случае вы поедете с привязанным к вашему автомобилю, как в «Отпуске Национального Лампуна», что не очень приятно - это утечка памяти .

  • Если у вас нет поводка на собаку, вы не можете гарантировать, что она будет там, когда вы хотите, чтобы она сделала трюк. Это может быть отправка сообщения освобожденному объекту .

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

Так что, по сути, если вы положили поводок на собаку, вы должны снять его. Если вы этого не сделали (т.е. вы не звонили new или retain и т. Д.), То вы этого не сделаете. Это относится ко всем объектам. BOOL и int не являются объектами, поэтому вам не нужно о них беспокоиться.

Ни одна собака не пострадала во время моих ежедневных программных занятий

1 голос
/ 11 сентября 2011

@"some string" - это autoreleased.Не беспокойся об этом.Когда вы передаете его объекту, например viewController.title = @"some string";, строка сохраняется и управляется другим объектом.

Существует два способа создания NSSet s, NSArray s или NSDictionary s..
Вы можете либо использовать alloc и init и впоследствии release, либо использовать методы +arrayWith..., которые возвращают объект autoreleased.

Не беспокойтесьо примитивных типах данных, таких как BOOL s или int s.

Свойства, значения которых retain являются strong свойствами, в основном они гарантируют, что объекты остаются в памяти доrelease это снова.В большинстве случаев вы используете retain для любого типа объекта, но остерегайтесь сохраняйте циклы хотя!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...