Недавно я столкнулся с this blog post, где обсуждаются два варианта освобождения переменных экземпляра. Чтобы дать Вам резюме:В выражениях, разделенных запятыми в Objective-C
Первый подход
- (void)dealloc {
[instanceVar release];
[super dealloc];
}
считается не оставить указатель живым до возвращения метода. Это может привести к неопределенному поведению. Второй подход
- (void)dealloc {
[instanceVar release], instanceVar = nil;
[super dealloc];
}
считается более стабильным для производства кода, поскольку instaceVar устанавливается в ноль.
OK. Вот вопрос, который вы ждете: Оба решения одинаковы? Или разделение запятой выражений делает их атомарными?
Да. Это уже упоминалось в упомянутом сообщении в блоге. Не могли бы вы (теоретически) получить ситуацию, когда вы используете значение _dangling_, прежде чем instanceVar будет установлен в nil? – lupz
@ lupz: Вы * можете *, теоретически у вас могло бы быть два потока, один из которых переопределил объект и вызвал 'dealloc' в одном потоке, в то время как' instanceVar' все еще используется в другом потоке. Обратите внимание, что это может проявиться только в результате ошибки переизбытка одного потока. Установка 'instanceVar' на' nil' только изменяет поведение ошибки, она на самом деле ничего не решает. – dreamlax