ivar проверяет, был ли он инициализирован и использован

#iphone #init #dealloc #ivar

#iPhone #инициализация #освободить #ivar

Вопрос:

допустим, у меня есть переменная экземпляра MyObject * test;

 @property(nonatomic, retain) MyObject* test;
  

.m

 @synthesize test;
  

Я мог бы инициализировать его или мог бы сейчас, в зависимости от того, нужно ли мне это. Если мне это не нужно, нет смысла тратить время на инициализацию.

Вопрос заключается в освобождении, безопасно ли выполнять следующую проверку и выпуск?

 -(void) dealloc
{
  if ( test != nil )
  {
   [test release];
  }
{
  

Спасибо!

Ответ №1:

Да, это безопасно. Однако отправка release в ноль не вызовет никаких проблем, поэтому вам не нужно проверять это.

Комментарии:

1. Я хотел бы добавить, что отправка любого метода в nil не вызовет никаких проблем.

Ответ №2:

это совершенно нормально. также более идиоматично просто опустить тест nil .

за кулисами компилятор (обычно * ) генерирует вызов objc_msgSend или один из его вариантов. реализация objc_msgSend (и варианты) позволяет объекту, которым вы сообщаете nil , быть в том смысле, что он четко определен и не считается ошибкой программиста для сообщения nil . возвращаемое значение objc_msgSend variations обнуляется:

пример:

 NSString * string = nil;
NSString * copy = [string copy]; << copy will be 0/nil
NSUInteger length = [copy length]; << length will be 0
  

это означает, что вы должны проверить значение nil, если возвращаете объект c — конструктор не будет вызван, если получатель равен нулю.

* как правило, в том смысле, что существует несколько функций c, которые компилятор вызывает для выполнения обмена сообщениями, а также некоторых других распространенных процедур.

Ответ №3:

Вам не нужно этого делать. Вы можете просто сделать это, если назначите автоматически освобожденный объект ivar:

 self.test = nil;
  

Редактировать:

Не забудьте вызвать [super dealloc] в конце функцию dealloc

Ответ №4:

Это безопасно, но не стандартная практика. Вы можете безопасно отправлять сообщения с нулевыми ссылками, и это большая часть того, как написан идиоматический Objective-C. Просто отпустите ivar:

 - (void)dealloc
{
    [test release];
    // ...