Objective C: Вы имеете к dealloc объектам свойства прежде, чем освободить родительский объект?

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

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

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

5
задан Marnix v. R. 15 July 2010 в 15:08
поделиться

4 ответа

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

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

Вам нужно будет освободить bar , когда вы освободите foo :

- (void)dealloc
{
    [bar release];

    [super dealloc];
}

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

15
ответ дан 18 December 2019 в 09:47
поделиться

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

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

2
ответ дан 18 December 2019 в 09:47
поделиться

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

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

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

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

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

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

0
ответ дан 18 December 2019 в 09:47
поделиться

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

0
ответ дан 18 December 2019 в 09:47
поделиться