Это зависит от того, как вы используете экземпляры этого класса.Например:
SomeClass *obj = [SomeClass new];
// never assign an address to obj.info
[obj release];
будет в порядке.
Однако, поскольку вы объявили это свойство для чтения-записи, вам необходимо принять во внимание владение объектом, на который указываетэта структура.
Например, в:
SomeClass *obj = [SomeClass new];
obj.info = someInfo;
[obj release];
объект, который вы выделили в -init
, не освобождается (вы его пропускаете), а объект указываетк someInfo
освобождается.Вы можете изменить установщик свойства на что-то вроде:
- (void)setInfo:(InfoStruct *)newInfo {
if (newInfo != info) {
free(info); // free previous object
info = newInfo;
}
}
, и в этом случае присваивание всегда освобождает предыдущий объект, если присваиваемое значение не совпадает с предыдущим значением.Это означает, что ваш класс фактически владеет объектом, адрес которого присваивается свойству.
Если вы решите, что класс не должен отвечать за освобождение объектов, отличных от того, который создан в -init
, вещи получаютсянемного сложнее.Если info
назначен какой-либо адрес, отличный от адреса исходного info
, созданного в -init
, клиентскому коду необходимо освободить obj.info
перед присвоением ему нового значения.Например:
SomeClass *obj = [SomeClass new];
free(obj.info);
obj.info = someInfo;
[obj release];
Это проблематично, потому что у вас есть код вне класса, освобождающий память, используемую объектом этого класса, что довольно навязчиво.И, если класс не отвечает за освобождение объектов, отличных от созданного в -init
, вам необходимо сохранить дополнительное состояние, указывающее, что -dealloc
освобождает только info
, если info
не изменилось послеобъект был инициализирован.
Также, как отметил Джим, правильное имя метода - dealloc
.