выпуск ивара и недвижимости в dealloc - PullRequest
1 голос
/ 21 марта 2012

Если я объявляю ивар без объявления свойства, и этот ивар можно использовать или нет в течение жизненного цикла объекта, нужно ли его выпускать в dealloc?

Я иногда видел, что свойства объявляются как ivar и property, а иногда имеют только объявление свойства. В чем разница? Какой способ лучше?

Пример:

@interface MyClass: NSObject
{
     NSObject *ivar;   // This is sometimes omitted.
}

@property (nonatomic, retain) NSObject *ivar;

@implementation MyClass
@synthesize ivar;

...

-(void)dealloc
{
   [ivar release];
   [super dealloc];
}

Как получается, что объявление ivar иногда опускается?

Другой случай, когда нет объявления свойства:

@interface MyClass: NSObject
{
     NSObject *ivar;
}

@implementation MyClass

-(void)thisMethodCanBeCalledOrNot
{
    ivar = [[NSObject alloc] init];

    [ivar useIt];

   //ivar must be alive for further uses in different methods of this class. For this is not released in this method.
}

...

-(void)dealloc
{
   [ivar release]; //If thisMethodCanBeCalledOrNot is never called, could this cause a over release in ivar?
   [super dealloc];
}

1 Ответ

3 голосов
/ 21 марта 2012

Да, вы должны отпустить.Когда вы вызываете [ivar release], ничего не происходит, если ivar равен nil, но если он содержит указатель на объект, вы могли бы вызвать утечку памяти, не выпуская его. не используйте self.ivar = nil в методе dealloc, поскольку метод setter может содержать логику, которая не нужна во время освобождения или даже может вызывать хитрые ошибки.При объявлении « modern runtime » автоматически синтезирует ivar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...