Dot обозначение dealloc? - PullRequest
       14

Dot обозначение dealloc?

2 голосов
/ 01 октября 2009
@property (copy) NSString *name;
@property (copy) NSString *orbit;
@property (copy) NSNumber *mass;
@property float surfaceTemp;
@property float rotationSpeed;

В настоящее время есть это

- (void)dealloc{
    [name release];
    name = nil;
    [orbit release];
    orbit = nil;
    [mass release];
    mass = nil;
    [super dealloc];
}

Если я напишу это с помощью точечной нотации (Objective-C 2.0) Это правильно?

- (void)dealloc{
    self.name = nil;
    self.orbit = nil;
    self.mass = nil;
    [super dealloc];
}

1008 * Гэри *

Ответы [ 2 ]

10 голосов
/ 01 октября 2009

Это плохая практика использовать ваши методы установки в -dealloc. Вместо этого используйте [name release].

Вызов сеттеров во время -dealloc может иметь непредвиденные последствия. При использовании KVO установка свойств может запустить другой код, вызывая побочные эффекты, поскольку ваш объект уже начал освобождать переменные экземпляра. Даже если не использовать KVO, это может вызвать потенциальные проблемы, если ваш метод установки использует другие переменные экземпляра, которые уже могут быть освобождены.

(обновлено для отражения комментариев)

0 голосов
/ 01 октября 2009

По моему опыту self.name = nil не делает то же самое, что [name release]; name = nil. Я предполагаю, что в синтезированном сеттере есть некоторый код, который избегает nil присваиваний, но YMMV. Свойства, на которых я наблюдал это, также были указаны (nonatomic, retain), поэтому вы также можете увидеть некоторые различия там.

Более того, нотация self. отправляет уведомления KVO, поэтому в этом случае также необходимо учитывать снижение производительности.

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