Цель-C: Нужно ли освобождать объекты свойств перед освобождением родительского объекта? - PullRequest
5 голосов
/ 15 июля 2010

Допустим, у меня есть объект с именем "foo", а другой объект с именем "bar" является свойством.

Когда «foo» освобождает, будет ли он автоматически удалять все ссылки на «bar», так что «bar» также освобождается? или "foo" освободит память и "бар" будет где-то всплывать в памяти? даже если все ссылки на "bar" определены в "foo".

спасибо заранее.

Ответы [ 4 ]

15 голосов
/ 15 июля 2010

Если у объекта foo есть какие-либо сохранения или копии (спасибо Дейву) bar, например, когда вы объявляете свойство как одно из следующих:

@property (nonatomic, retain) NSString *bar;
// Or
@property (nonatomic, copy) NSString *bar;

Вам нужно будет освободить bar при освобождении foo:

- (void)dealloc
{
    [bar release];

    [super dealloc];
}

Система не освободит пространство памяти bar для вас, пока вы не избавитесь от всех ссылок на нее (т. Е. Счетчик ссылок уменьшится до 0), поэтому вам придется самостоятельно отслеживать количество ссылок и объектов .

2 голосов
/ 15 июля 2010

Если вы выделяете память, вы должны освободить ее.Итак, да, вызовите [bar release] или self.bar = nil (если вы используете синтезированные свойства и все такое) в вашем dealloc.

См. Здесь для ознакомленияк управлению памятью на iOS.

0 голосов
/ 16 июля 2010

Основная причина использования self.bar = nil была бы, если бы bar была ссылкой на представление, созданное в файле пера. В этом случае можно включить эту строку в -(void)viewDidUnload, поскольку это позволит системе освободить этот объект, когда представление будет перетасовано. Если представление возвращается, оно будет перезагружено через файл пера. Это, однако, не освобождает от необходимости использовать 'self.bar = nil или [bar release] в -(void) dealloc

0 голосов
/ 15 июля 2010

Объект A отвечает за освобождение любых ссылок на другие объекты (Объект B, Объект C и т. Д.), Когда он освобожден - это не происходит автоматически.

Это делается в методе -dealloc на объекте:

- (void)dealloc 
{
    [propertyB release];
    [propertyC release];
    [super dealloc];
}

(или если свойства доступны для чтения / записи и помечены как retain, вы можете заменить [self setPropertyB:nil] и т. Д.).

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

(Это относится ко всем разработкам для iPhone OS, которые вы отметили. Я предполагаю, что вы не говорите о среде сбора мусора на Mac, которая имеет другие правила и поведение и выполняет некоторые действия автоматически.)

...