Преимущество автоматической сборки мусора в том, что вам не нужно явно освобождать/освобождать свои объекты, как вы сказали. Недостатком является то, что вы не можете быть уверены, когда (или даже если) какой-либо данный экземпляр объекта будет выпущен.
У C# есть другие механизмы для выпуска других ресурсов, таких как файлы или соединения db, которые должны быть освобождены с задержкой. Например, using
позволяет убедиться, что IDispose вызывается на объекте точно.
Системы сбора собранного мусора, как правило, имеют больший объем памяти в любое время, чем правильная ручная реализация. Конечно, у вас нет утечек памяти.
Качество и производительность сборщиков мусора могут значительно отличаться от того, что у вас может не быть большим контролем. Например, при запуске GC может наблюдаться заметное отставание. В .NET вы можете позвонить GC.Collect()
, чтобы сообщить GC, что сейчас самое подходящее время, но это может случиться или не случиться.
В настоящее время цель-C также является сборкой мусора на Mac. На iPhone это подсчет ссылок, поэтому я предполагаю, что именно там вы столкнулись с проблемой.
В системах сбора мусора вы все равно можете столкнуться с проблемой, когда объект висит на ссылке на объект, который вы ожидаете от сбора мусора. Сборщик мусора не будет очищать это, и поэтому память, по сути, протекает.
В подсчитанных системах вам не нужно отслеживать каждый объект, указывающий на экземпляры объекта, но вам нужно указать, что вы хотите, чтобы они были выпущены.
EDIT: Я думаю, я не сказал этого явно - вы не можете вручную управлять распределением памяти на C#.
Хм, похоже, я участвую в соревнованиях с кучей разработчиков iPhone, которые не знают, что Objective-C 2.0 содержит сборку мусора на компьютерах Mac. http://en.wikipedia.org/wiki/Objective-C#Garbage_collection – Justin
:) нет. Я думаю, что у них более высокие голоса, потому что они ответили на вопросы 1 к 1 :). но было очень интересно узнать, что объектив c на mac имеет сборщик мусора – aryaxt