Неоднозначный сценарий управления памятью iPhone - PullRequest
0 голосов
/ 07 апреля 2010

У меня есть некоторые трудности, чтобы понять этот сценарий.

  • Я создаю объект
  • Я установил для его сохраненного свойства что-то
  • Я забыл освободить его собственность
  • Я отпускаю объект

Поскольку я не освободил свойство в методе dealloc, приведет ли сценарий к утечке памяти или свойство будет освобождено автоматически?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2010

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

Вы несете ответственность за освобождение объекта, если вы получили объект из метода -copy, -alloc, -retain или -new.

Если вы сделаете это:

[obj setProp:foo];

это ваша обязанность выпустить foo?Нет - см. Правила.Если obj сохраняет его (и вы говорите, что знаете, что он это делает), то обязанность obj освободить его в методе dealloc, если не раньше.

Таким образом, если вы сделали это, оно сбалансировано, независимо от того, какое свойство -prop.

id obj = [[MyObject alloc] init];
[obj setProp:foo];
[obj release];

* за исключением случаев реализации init, copy, dealloc и accessorметоды.

0 голосов
/ 07 апреля 2010

Да, это утечка.

Сохраните, alloc увеличит счетчик на единицу.Выпуск уменьшит счетчик.Он освободит память, когда счетчик достигнет нуля.

Думайте о сеттере так:

[newvalue retain];
[property release]; 
property = newvalue;

Итак ..

  • создать объект => 0+ 1 = 1
  • назначить его какому-либо объекту как свойство сохранения => 1 + 1 = 2
  • освободить объект => 2-1 = 1

Вам придется когда-нибудь снова отпустить этот объект.И, поверьте мне, autorelease не очень хорошо работает в среде iphone.

...