#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.
Это не всегда может быть так.