self.property to nil vs [ivar release] дело закрыто - PullRequest
1 голос
/ 16 марта 2012

Было много дискуссий о том, почему вы не должны использовать setter в dealloc, как вы используете в viewDidUnload.Вопрос в том, почему бы просто не использовать [свойство release] в dealloc или viewDidUnload?Разве это не заканчивает обсуждение или есть причина, по которой вместо этого следует использовать self.property = nil в viewDidUnload?

То есть мы всегда следуем этому идиому для всего - вместо использования одной формы в viewDidUnloadеще один в dealloc, который кажется бессмысленным.

[ivar release];
ivar = nil;

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

Общая идея заключается в том, что после dealloc ничего не произойдет с объектом, поэтому вы можете просто освободить свойство и не беспокоиться о том, что он является недопустимым указателем.С другой стороны, если вы сделаете [release release] в viewDidUnload и не установите его равным nil, он будет содержать недопустимый указатель, и это может привести к сбою, если свойство используется перед назначением ему нового действительного значения.

0 голосов
/ 16 марта 2012

Все остальные ответы рассматривают оба пути одинаково. Но подумайте, когда у вас есть атомное свойство. Это много короче и чище, чем "чистый" способ.

0 голосов
/ 16 марта 2012

Свойства сохраняются для этого, вы можете установить nil их везде, потому что они сохраняют освобождение (сеттеры выглядят как -(void)setProp { [prop release]; self.prop = nil; }). Но если вы используете [something release], вы должны сделать это методом viewDidUnload, потому что представление может быть выгружено, но контроллер не освобожден, что означает возможную утечку памяти в viewDidLoad. И если вы дважды наберете [something release], это вызовет сбой при неправильном уменьшении счетчика

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