2009-10-04 4 views
2

Я новичок в объективе, и у меня проблемы с управлением памятью, я прочитал правила управления памятью Apple, но мне нужно немного разъяснений здесь, это довольно просто, я думаю, но я хотел бы спросить вас, если я прав:Должен ли я отпустить это свойство?

Учитывая это свойство:

@interface Test : NSObject { 
    NSArray *property1; 
} 
@property (nonatomic,retain) NSArray* property1; 
@end 

... 

//And its implementation: 
@implementation Test 
@synthetize property1; 
-(id) init { 
    if (self=[super init]) { 
    self.property1=[[[NSArray alloc] initWithCapacity:5] autorelease]; 
    } 
    return self; 
} 
-(void) dealloc { 
    [super dealloc]; 
    [property1 release]; 
} 

@end

ли право выдавать сообщение Autorelease для выделенного объекта в методе инициализации? , я делаю это в документе Apple, говорит, что каждый выделенный объект должен быть выпущен разработчиком, тогда, я думаю, alloc устанавливает значение удержания в 1, тогда свойство (неатомное, сохраняемое) добавляет 1, поэтому сохраняем == 2, затем autorelease substracts 1, и когда вызывается метод dealloc, свойство1 освобождается и сохраняет count == 0, я прав?

+1

FYI: '[super dealloc]' должно быть последним в вашем методе dealloc. Выполнение чего-либо после вызова '[super dealloc]' является ошибкой. – Chuck

+1

Вы можете упростить создание NSArray, выполнив: '[NSArray arrayWithCapacity: 5]'. Это то же, что и у вас выше. –

+0

Также поймите, что вы создаете неизменяемый массив емкостью 5, и вы не сможете изменять содержимое после создания без замены массива. Вы также можете вызвать '[NSMutableArray arrayWithCapacity:]', но вы хотите, чтобы тип свойства соответствовал, если массив должен быть изменен. –

ответ

6

У вас есть права на управление памятью, хотя Apple (и многие другие люди) обычно не рекомендуют использовать средства доступа в ваших методах инициализации, потому что у аксессуаров могут быть побочные эффекты, помимо простой установки переменной экземпляра, которую ваш класс может не настроить для обработки еще. И в этом случае вы не захотите автообновления, так как вы захотите владеть объектом.

2

одна сторона примечание: в вашем dealloc, вам нужно освободить свойство до того вызова [super dealloc], потому что [super dealloc] в конечном счете освобождает память объекта, который включает в себя память, содержащую переменную property1, поэтому он является недействительным для обозначения эта переменная после звонка [super dealloc]. Оно должно быть:

-(void) dealloc { 
[property1 release]; 
[super dealloc]; 
} 
+0

+1 Правильно, и в более общем смысле '[super dealloc]' всегда должен быть последним, что вы вызываете в методе dealloc. –

0

Одна из хороших вещей об использовании свойств является то, что вы можете инкапсулировать все ваши «рилизинг» поведение независимо от того, является ли ваш набор свойств, чтобы сохранить, копировать, передавать, или любой другой, просто делая это:

self.property1 = nil; 

Лично я получил в привычку настройки всех свойств ноль (с помощью self.property, а не только получить доступ к переменной-члена непосредственно) в dealloc так, что даже если я изменю, как работает управление памятью для переменной-члена она работает правильно.

Смежные вопросы