Управление памятью в Objective C и указателях установки на ноль

Будет указатель на объектное движение к nil когда его количество переходит в 0 или когда dealloc называют? Почему или почему нет?

5
задан Quinn Taylor 9 January 2010 в 16:49
поделиться

4 ответа

Возможно, статья Википедии на регулярных языках может объяснить это лучше, чем мы можем. Тем не менее, я дам ему шанс.

С теоретической точки зрения, обычный язык (набор последовательностей) - это язык, который может быть сгенерирован с помощью автомата конечного состояния . В терминах программиста это эквивалентно утверждению, что может быть сгенерировано с помощью регулярных выражений . Таким образом, все конечные языки (множества последовательностей) являются регулярными, но существуют некоторые бесконечные языки, такие как n b n (язык всех последовательностей n а, за которыми следуют n b), которые не могут быть распознаны с помощью FSA или регулярных выражений. Существуют более мощные вычислительные устройства (например, современные компьютеры, смоделированные с помощью Turing Machines ), которые могут распознавать эти языки.

Причина, по которой регулярные выражения используются так много в программировании для последовательности поиска, заключается в том, что они могут распознавать подавляющее большинство последовательностей, которые важны для нас, программистов, и в то же время могут быть реализованы для поиска очень быстро, используя автоматы конечного состояния.

-121--4180466-

Из того, что я понимаю, (а это только из того, что я делаю наблюдения и мои невероятные силы:: кашель, кашель:: вывода) ui - это объект или совокупность элементов, на которые воздействуют в пользовательском интерфейсе. Для доступа к ним необходимо выбрать объект, который требуется использовать, а не выбрать объект в целом. Например, в dropable это ui.draggable или ui.dropppable . В примере ui.selected - это то, что может работать.

$("#selectable").selectable({
    selected: function(event, ui) {
       $(ui.selected).find("input").attr('checked', true);
    }
});

Надеюсь, что ответит на ваш вопрос.

-121--3632237-

Нет, не будет, так как отмена выделения не позволяет изменить указатель. Это может произойти только при передаче указателя указателю.

Если вы хотите убедиться, что он установлен на ноль, вы должны сделать это самостоятельно.

Некоторые считают это хорошей практикой, некоторые считают это пустой тратой времени, так как ваш код должен быть структурирован, чтобы не использовать указатели после освобождения (до перераспределения).

Я на самом деле склоняюсь к последнему лагерю, но вижу, почему люди хотят защитить себя от доступа к свободной памяти (программирование в обороне редко бывает плохой идеей).

13
ответ дан 18 December 2019 в 07:29
поделиться
[

]Я не уверен, переходит ли указатель в нулевое значение или он просто указывает на недействительные данные, но его хорошее соглашение о кодировании, чтобы присвоить вашим переменным значение nil после того, как вы их отпустите. [

]
2
ответ дан 18 December 2019 в 07:29
поделиться
[

] Подумайте об этой ситуации:[

] [
void *p = malloc (100);

while (someCondition)
{
    //  do something with p
}

free (p);

// p is not set to NULL for you, it still points to where it always did
] [

]Аналогично, когда объект Objective-C разобрался, любые указатели на этот объект все равно указывают на то, где он находился. Это приводит к ошибкам, когда другой объект выделяется в то же самое пространство (или даже если ничего не выделяется в то же самое пространство)[

].
1
ответ дан 18 December 2019 в 07:29
поделиться

При нормальном сохранении памяти памяти, нет. С включенной коллекцией мусора это происходит, если указатель объявлен как __ слабые (для объектов объектов-C, по умолчанию __ сильнее ). Коллектор мусора будет развязывать слабые ссылки для вас, когда они утилизируются, что делает их идеальными для указывания делегатов и полусменных объектов. См. Также Nspointerarray , NSmaptable и NShashtable и их поддержка слабых отношений. (Примечание. Один должен понимать, что слабая ссылка не помешает, чтобы объект быть собранным мусором; он обнужен, когда никаких сильных ссылок не указывает на тот же адрес. См. Этот документ для краткого резюме такого поведения. )

Существует множество других преимуществ для сбора мусора объекта-С, и я от всей души рекомендую использовать его, если сможете. (Это доступно на OS X 10.5+, но не на ОС iPhone.) Улучшения производительности в снежном леопарде наиболее впечатляют, и уже было быстро, чтобы начать.

, который сказал, что @Darren имеет хорошую точку: обычно хорошая практика для ноль ваших собственных переменных при освобождении их содержимого. Если вы хотите избежать висящих указателей на чрезмерные объекты, ваша лучшая ставка состоит в том, чтобы принять привычку нести переменную. Это не потребуется надернкой времени выполнения, и он читается. Что еще более важно, настройки переменных в Nil помогают систему сбора мусора наиболее эффективно работать, поскольку она указывает на память, которую можно безопасно восстановить. Код также будет работать в обоих режимах идеально.

Тем не менее, я вообще не NIL OUT значения в -DealLoc , поскольку память, которую вы изменяете, собирается быть восстановленным, и если какая-то другая часть кода может столкнулся с ошибкой из-за использования выпущенного значения, они не должны использоваться с Deallocated объектом для начала. (Это часто происходит, когда один объект не был должным образом сохранен другой, и последний отделен, оставив висячий указатель .) Возможные исключения из этого могут включать в себя поступлению, где не относящиеся к проблем. в самом деллоке, но этот тип поведения обычно не (и не должен) происходит при уничтожении объекта.

5
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: