2013-05-14 2 views
1

Я установил в моей interface.h свойство какДолжен ли я освободить неиспользованный ivar?

@porperty(nonatomic, retain) *foo; 

Если я не использую этот Ивар в моей реализации я должен выпустить его в dealloc?

+2

Да, вы должны - что-то за пределами объекта, возможно, установить его на какой-либо объект. – 2013-05-14 07:36:27

+1

Вы должны использовать ARC в своих проектах лучше в управлении памятью –

+0

@AhmedZ. нет, это не лучше. – justin

ответ

2

Да:

- (void)dealloc 
{ 
    // Other release code 
    [_foo release]; 

    [super dealloc]; 
} 

EDIT: Благодаря @borrrden за отзыв о избегая сеттеров во dealloc.

+3

Не рекомендуется использовать «self» в методе dealloc (для возможных проблем с KVO), а вместо этого просто выпустить (и нуль, если хотите) опорную переменную. – borrrden

+0

@borrrden Можете ли вы предоставить источник этой рекомендации. Я понимаю, что вы позволяете сеттеру выполнять эту работу за вас, а это значит, что ее нужно вызвать с помощью 'self'. – trojanfoe

+0

@trojanfoe [Есть проблемы с использованием self.property = nil in dealloc?] (Http://stackoverflow.com/questions/5621139/is-there-any-problem-using-self-property-nil-in-dealloc), просто взгляните.(его новая информация для меня тоже) –

-1

да вы должны выпустить

для выпуска вы можете написать так:

- (void)dealloc 
{ 
    // other release stuff 

    if(foo != nil) 
    { 
     [foo release]; 

     foo = nil; 
    } 
    [super dealloc]; 
} 
+3

Тест на ноль не нужен. Вы можете безопасно отправить «release» на нулевой объект. –

+0

Если он забыл сделать это nil, то условие (foo! = Nil) будет истинным, и foo (обвисший указатель) будет выпущен в любом случае, что приведет к сбою. Это не поможет в случае, о котором вы упомянули. –

+0

да мужчина ваш правый. Я хочу выпустить, если объект еще не выпущен. –

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