Объявите свойство retain в классе, будет ли компилятор добавлять [свойство release] в -dealloc по умолчанию?

Возможный дубликат:
Требуется ли освобождение памяти для свойств Objective-c 2.0?

Например:

@interface DataMode : NSObject {
    NSString * name;
}

@property (nonatomic, retain) NSString * name;

@end

Будет ли компилятор автоматически добавлять [name release] в -dealloc?

- (void) dealloc
{
   [name release];    // if we  don't add it , will the compiler add "[name release]"???
   [super release];     

}

2 ответа

Это зависит от того, какую схему управления памятью вы используете:

  • При сборке мусора вам не нужно освобождать переменную экземпляра, которая поддерживает объявленное свойство - сборщик мусора автоматически делает это. На самом деле, вы не будете определять -dealloc метод вообще, даже если вам нужно выполнять другие задачи после освобождения: сборщик мусора отправляет -finalize вместо -dealloc;

  • С автоматическим подсчетом ссылок (ARC) вы бы не определили это -dealloc метод. ARC автоматически освободит переменную экземпляра, которая поддерживает объявленное свойство. Вы можете определить -dealloc метод для выполнения других домашних работ, если это необходимо, но вы не будете отправлять [super dealloc];

  • При ручном управлении памятью вам нужно вручную освободить переменную экземпляра, которая поддерживает объявленное свойство, а затем отправить [super dealloc],

Так как вы добавляете или скорее создаете name это ваша ответственность, чтобы выпустить его. Так что вам нужно добавить [name release] в dealloc а также в ViewDidUnLoad использование name = nil,

У ObjectiveC есть сборщик мусора, но в iOS часть сбора мусора была удалена. Таким образом, распределение, освобождение, сохранение и т. Д. Вы должны знать...

Другие вопросы по тегам