Почему среда выполнения Objective-C не устанавливает равные нулю экземпляры объекта в значении 0? - PullRequest
4 голосов
/ 27 сентября 2011

Иногда я устанавливаю объекты на nil после их освобождения, чтобы избежать сбоев из-за неожиданных сообщений, отправленных dealloc 'объектам.

Почему среда выполнения Objective-c не делает это автоматически , когда объект наконец-то dealloc 'd?

Ответы [ 4 ]

7 голосов
/ 27 сентября 2011

Потому что указатели передаются по значению, а не по ссылке. Все, что получает dealloc, является локальной копией указателя; любые изменения, которые он делает, отбрасываются. То же самое касается C free и C ++ delete.

3 голосов
/ 27 сентября 2011

То, что вы описываете, называется слабой ссылкой на ноль. Эта функция доступна во время выполнения автоматического подсчета ссылок (ARC) в OS X 10.7. До версии 10.7 вы можете использовать слабую ссылку Майка Эша реализацию .

Без явной поддержки времени выполнения (и некоторых небольших, но неизбежных накладных расходов) стандартные указатели в стиле C (id в Objective-C - указатель на структуру) являются просто адресом памяти (целым числом) и не отслеживаются во время выполнения. Ничто не мешает вам делать копии этого значения в другом месте в памяти или , хранить значение в целом числе соответствующего размера и приводить к id позже (конечно, если вы сделаете что-то из этого, ты убиваешь тюленя). Таким образом, когда объект освобожден, нет способа узнать, где (или сколько) ссылок есть на этот объект.

3 голосов
/ 27 сентября 2011

В target-C объекты всегда доступны как указатель.Если для объекта задано значение nil, просто измените значение указателя, а не значение объекта.

В вашем методе у вас есть доступ только к значению объекта, а не к указателю, указывающему на него!

Как@ Дэвид Данхэм говорит, что вы можете иметь более одного указателя на объект, так что откуда знает компилятор?

И более того, чтобы упростить задачу, представьте следующий код:

int a;
int* aPtr = &a;

Если вы измените значение a, вы можете получить доступ к измененному значению через *aPtr верно?Но вы можете изменять значение a так долго, как захотите, значение aPtr не изменится, так как это не та же переменная!

Таким образом, даже если у вас есть только один указатель на ваш объект, если вы измените значение объекта, указатель все равно будет указывать на то же значение адреса!

3 голосов
/ 27 сентября 2011

Как среда выполнения сможет отследить все такие ссылки?

MyClass* a = [MyClass new];
MyClass* aCopy = a;
[a release];
a = nil;  // Tidy up
[aCopy crashNowPlease];

Иногда вы можете отследить подобные вещи с помощью Build & Analyze.

Также вы сможетеиспользовать обнуление слабых ссылок в будущем (или Майк Эш создал такое средство ).

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