Объявите свойство 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 часть сбора мусора была удалена. Таким образом, распределение, освобождение, сохранение и т. Д. Вы должны знать...