2010-09-09 2 views
4

SO Я уже знаю об управлении памятью в объективе C, и я никогда не знал об этом во время программирования в .net (C#). Но у меня все еще есть некоторые вопросы о том, как все делается.Управление памятью - C# VS Цель C?

-Какой код протекает в объективе c, если мы выделяем объект и не выпускаем его?

-Почему это не утечка в C#?

-Какие преимущества и недостатки автоматического сбора мусора?

-Почему не используется автоматическая проверка на каждом выделенном объекте (Цель C)?

-Можно позаботиться о памяти вручную (C#)? так что, скажем, я создаю экземпляр объекта, и когда я закончил, я хочу его выпустить, и я не хочу ждать, пока сборщик мусора сделает это?

+1

Хм, похоже, я участвую в соревнованиях с кучей разработчиков iPhone, которые не знают, что Objective-C 2.0 содержит сборку мусора на компьютерах Mac. http://en.wikipedia.org/wiki/Objective-C#Garbage_collection – Justin

+0

:) нет. Я думаю, что у них более высокие голоса, потому что они ответили на вопросы 1 к 1 :). но было очень интересно узнать, что объектив c на mac имеет сборщик мусора – aryaxt

ответ

8
  • Протекает в Objective-C, потому что Objective-C не предпринимает никаких действий. Он полагается на то, что вы делаете всю работу. Он не протекает в C# (точнее, в .NET), потому что в нем используется сборщик мусора , который очищает объекты, которые больше не используются.

  • Главное преимущество сборки мусора заключается в следующем: у вас гораздо меньше утечек памяти. (По-прежнему возможно утечка памяти, например, путем заполнения списка на неопределенный срок, но это сложнее сделать случайно.) Раньше считалось, что сбор мусора имеет недостаток в том, что она может замедлить работу программы, потому что она продолжает делать сборку мусора в фоновом режиме, и у вас мало контроля над ней. Однако на самом деле разница незначительна: на вашем компьютере (например, драйверах устройств) постоянно выполняются другие фоновые задачи, сборщик мусора также не сломает верблюд.

  • Автоматическое освобождение (поскольку оно используется в C++, когда переменная, отличная от указателя, выходит за пределы области действия) является опасной, поскольку она открывает возможность иметь ссылку на нее до сих пор даже после того, как объект был удален. Если ваш код затем пытается получить доступ к объекту, процесс переходит в kaboom большое время.

  • Да, можно сказать C# освободить память, вызвав сборщик мусора напрямую (GC.Collect()). Однако я еще не видел случая, когда это вообще необходимо. Если у вас на самом деле закончилась нехватка памяти, сборщик мусора уже будет автоматически и бесплатно загружаться как можно больше.

+0

Вы можете сказать, что сборщик мусора запускается, но он будет собирать только то, что он «должен» - он не освободит ваш объект, если на нем все еще есть ссылки, а также не следует. Но GC.Collect() - это только намек. Он рассказывает сборщику мусора, что сборка будет практической сейчас, потому что мы можем справиться с задержкой, но она может игнорировать вас, если не думает, что есть много работы. –

+1

У Objective-C на Mac есть сборщик мусора (а не на iPhone в этой точке). – Justin

4

Преимущество автоматической сборки мусора в том, что вам не нужно явно освобождать/освобождать свои объекты, как вы сказали. Недостатком является то, что вы не можете быть уверены, когда (или даже если) какой-либо данный экземпляр объекта будет выпущен.

У C# есть другие механизмы для выпуска других ресурсов, таких как файлы или соединения db, которые должны быть освобождены с задержкой. Например, using позволяет убедиться, что IDispose вызывается на объекте точно.

Системы сбора собранного мусора, как правило, имеют больший объем памяти в любое время, чем правильная ручная реализация. Конечно, у вас нет утечек памяти.

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

В настоящее время цель-C также является сборкой мусора на Mac. На iPhone это подсчет ссылок, поэтому я предполагаю, что именно там вы столкнулись с проблемой.

В системах сбора мусора вы все равно можете столкнуться с проблемой, когда объект висит на ссылке на объект, который вы ожидаете от сбора мусора. Сборщик мусора не будет очищать это, и поэтому память, по сути, протекает.

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

EDIT: Я думаю, я не сказал этого явно - вы не можете вручную управлять распределением памяти на C#.

+0

С точки зрения aC#, автоматическая сборка мусора также имеет ограничения на память и скорость - потому что система должна отслеживать все переменные в куче и все ссылки на них. Также, когда автоматический сборщик мусора будет работать, нельзя предсказать (хотя его можно назвать), так что вы можете найти плохо написанный код времени, на который может негативно повлиять работа сборщика мусора. –

+0

@Tim - Мой ответ уже упоминал, что GC имеет последствия для памяти, и я говорил о различной производительности реализации GC.Должен ли я добавить что-то еще к моему ответу? – Justin

5

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

C# не может освободить объект без сборщика мусора. Если вы отпустите объект, на который все еще ссылаетесь, ваша программа будет разбиваться, когда вы попытаетесь ее использовать. Это всегда риск ручного управления памятью, но, как и все «управляемые памятью языки», он пытается помешать вам совершить именно эту ошибку. Если вы хотите явно закрыть работу объекта, реализуйте интерфейс IDisposable для этого типа объекта и используйте метод Dispose() для этого объекта - по существу деструктор. Убедитесь, что вы с ним все сделали, и что объект будет вести себя корректно (путем исключения исключений), если что-то пытается использовать его после того, как оно было Dispose() d of.

Объектив-C подсчитывается по ссылке. Когда объект находится вне ссылки, он удаляет себя. Это не плохое решение для «кто-то все еще использует этот объект?» проблема, за исключением структур данных, которые относятся к самим себе; круговые структуры данных будут вешать навсегда, если их не будет тщательно обработать. .NET не является ссылочным счетчиком, поэтому он избавится от круговых структур данных, которые не могут быть достигнуты при запуске кода.

Autorelease - это просто «релиз позже», для возврата значения, которое должно саморазрушиться, если код, который его захватывает, сразу не хочет удерживать его, насколько я понимаю. (Я не программист Objective-C, хотя.) Он обходит «кто выпускает этот объект?» проблема для вызовов, которые возвращают объект, не уничтожая его до завершения функции. Однако это особый случай использования, и это не имеет смысла в большинстве других случаев.

+0

Автореферат может использоваться для более чем возвращаемых значений. Он может использоваться для очистки кода в функциях, где вы не хотите иметь выпуск для всего в конце или где вы хотите создать переменную и передать ее другой функции без создания ссылки. Автореферат может быть сложным при запуске, хотя, как если бы вы освободили объект, это может привести к тому, что проблема возникнет позже в вашем исполнении кода, где может быть неясно, в чем причина проблемы. – skorulis

+0

Я не программист Objective-C, поэтому спасибо за информацию! Я хотел бы изменить свой последний абзац, чтобы быть более полезным. Что действительно делает автореферат? По какой-то причине трехминутная документация по скиммированию не принесла полного просветления. :-) –

+2

Objective-C имеет сборщик мусора, но он доступен только для Mac OS X. – dreamlax

Смежные вопросы