Nima uchun bu RELEASE RUNTIME ERROR ishlab chiqarmaydi?

Mening bu qismim:

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

  [myFooOne release];

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

nima uchun myFooTwo.name runtime error o'rniga to'g'ri chiqdi ishlab chiqaradi?

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

rahmat.

1

2 javoblar

Siz faqat ozod qilingan xotira boshqa narsa uchun qayta ishlatilmagani va yozilmagani uchun omadingiz etarli. Aks holda, bu muvaffaqiyatsiz bo'ladi.

YES ga o'rnatilgan NSZombieEnabled ilovasini ishga tushiring va ish vaqtida xatolikni oshirishi kerak.

4
qo'shib qo'ydi

Foo ob'ektini chiqarganingizda, oldindan ajratilgan xotira bo'sh bo'ladi, lekin bu xotira blokidagi ma'lumotlar "tozalangan" degan ma'noni bermaydi. Bunday holda myFooTwo ko'rsatgichlari hali ham joriy Foo ma'lumotlariga ishora qilmoqda.

Bu har doim ham bo'lishi mumkin emas edi.

1
qo'shib qo'ydi