Установка объекта со свойством «Assign» для nil - PullRequest
2 голосов
/ 20 января 2011

Если у меня есть переменная, определенная со свойством «Assign», тогда нормально ли устанавливать их в nil в методе dealloc?

@property (nonatomic, assign) id test;

- (void)dealloc {
    self.test = nil;
}

Ответы [ 2 ]

4 голосов
/ 20 января 2011

Лучше выпустить ивар напрямую.Если подкласс переопределяет методы установки свойства, ваш объект может утечь, потому что ваш метод установки не вызывается.Учтите:

@interface ClassA
@property (readwrite, retain) id anObject;
@end

@interface ClassB : ClassA
@end

@implementation ClassA
@synthesize anObject;

- (void)dealloc {
    self.anObject = nil;

    [super dealloc];
}
@end

@implementation ClassB
- (void)setAnObject: (id)anObject {
    // do nothing!
}
@end

Экземпляры класса B будут вытекать anObject!

1 голос
/ 20 января 2011

Зависит от того, как вы это делаете, если вы делаете это через установщик свойств (не рекомендуется), тогда да.

Если вы выполняете прямое назначение, то нет, потому что задержанный объект будет протекать.

Так что это нормально:

- (void) dealloc {
   self.test = nil;
   [super dealloc];
}

Но это не ходи :

- (void) dealloc {
   test = nil;
   [super dealloc];
}

Мой совет - просто отправить сообщение release всем вашим оставшимся иварам в -dealloc, это будет работать хорошо, потому что если test окажется nil, то ничего не произойдет.

Поверь мне. Отправьте release прямо в -dealloc. Это все.

- (void) dealloc {
   [test release];
   [super dealloc];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...