Почему в этом ВЫПУСКЕ не возникает ОШИБКА ВО время ВЫПОЛНЕНИЯ?

#ios #objective-c #memory-management

#iOS #objective-c #управление памятью

Вопрос:

Это мой фрагмент:

   Foo *myFooOne = [[Foo alloc] initWithName:@"my string"];
  Foo *myFooTwo = myFooOne;

  [myFooOne release];

  NSLog(@"Name: %@", myFooTwo.name);
  

почему myFooTwo.name выводится правильный вывод, а не a runtime error ?

 2011-10-28 14:45:10.718 Example[6410:f803] Name: my string
  

Спасибо.

Ответ №1:

Вам просто повезло, что освобожденная память не была повторно использована для чего-то другого и не была перезаписана. В противном случае это приведет к сбою.

Запустите приложение, для которого NSZombieEnabled установлено значение YES, и оно должно выдать ошибку во время выполнения.

Ответ №2:

Когда вы освобождаете объект Foo, его ранее выделенная память освобождается, но это не обязательно означает, что данные в этом блоке памяти «очищаются». В этом случае указатель myFooTwo по-прежнему указывает на действительные данные Foo.

Это не всегда может быть так.