Различия между Objective-C 2.0 и CLR в отношении управления памятью

StackOverflow https://stackoverflow.com/questions/813616

Вопрос

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

Я думал, что выберу путь сравнения, а не попытаюсь начать с нуля. Я не могу найти много различий между CLR (.net) и Objective-C 2.0, поэтому мне интересно, может ли сообщество по переполнению стека помочь мне с этим вопросом.

Каковы ключевые / важные различия в управлении памятью между Objective-C 2.0 и CLR? Что касается Objective-C 2.0, я работаю на iPhone OS, и функция автоматического выпуска не рекомендуется.

Полагаю, я ищу сравнение двух ... Поскольку я работаю в .NET, что мне нужно знать об управлении памятью Objective-C 2.0?

Всем спасибо!

Это было полезно?

Решение

CLR работает на виртуальной машине; все освобождение объектов обрабатывается системой сбора мусора. Как правило, в Objective-C память должна управляться вручную через старый стиль C malloc / free или через систему подсчета ссылок сохранения / освобождения. Если вы приехали со стандартного "C" фон, техника не будет казаться слишком чужой.

При подсчете ссылок система подсчитывает, сколько раз использовался конкретный объект - это, в основном, " сохранить " упомянутое выше. Когда что-то делается с использованием объекта, объект вручную отправляет " выпуск " сообщение, которое уменьшает счетчик сохранения объекта на 1. Когда счет достигает 0, система автоматически освобождает объект. Это может показаться чрезвычайно громоздким по сравнению с CLR / .NET, но этот механизм обеспечивает лучшую производительность и больший контроль.

Если вы программируете в Objective-C 2.0 на Macintosh, вам повезло, поскольку сборку мусора можно включить с помощью параметра в XCode. Это будет ближе к тому, что обеспечивает CLR. Если вы разрабатываете на iPhone, сборка мусора стоит слишком дорого с точки зрения памяти и процессора, так что это не вариант. Память должна управляться вручную.

К счастью, существует промежуточная опция, которая обычно используется для отправки и " autorelease " сообщение объекту. Этот механизм, включенный как в Macintosh, так и в iPhone, в основном объединяет выделенные объекты в глобальный словарь (его фактически называют пулом автоматического выпуска). Либо, когда приложение существует или когда пул очищается, объекты затем распределяются. Однако не все входит в пул авто-релизов, и вы не хотите помещать все туда. Я рекомендую сухое, но важное чтение языка программирования Objective-C 2.0 с сайта Apple, которое становится более подробным.

http://developer.apple.com/documentation /Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

Удачи и терпения. Objective-C не новичок в этом блоке, как .Net (ему более 25 лет), но у него есть некоторые невероятные функции, которые .Net только начинает внедрять.

Другие советы

На iPhone это руководство. Если вы выделяете или сохраняете память, вы должны освободить ее.

В .NET CLR вас не волнует, какова память или что делает с ней объект по большей части.

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

Одна вещь, к которой мне нужно было привыкнуть, это то, что у вас может быть свойство, которое автоматически сохраняет, поэтому, если вы создаете объект, то присваиваете его свойству, у которого будет счетчик 2. Что лучше работает, так это создание возьмите переменную temp, присвоенную свойству, затем отпустите переменную temp, чтобы уменьшить счетчик до 1.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top