Почему этот RELEASE не приводит к ошибке RUNTIME? - PullRequest
1 голос
/ 28 октября 2011

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

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

  [myFooOne release];

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

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

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

спасибо.

Ответы [ 2 ]

4 голосов
/ 28 октября 2011

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

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

1 голос
/ 28 октября 2011

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

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

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