Различия между Objective-C 2.0 и CLR в отношении памяти - PullRequest
1 голос
/ 02 мая 2009

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

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

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

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

Спасибо всем!

Ответы [ 2 ]

1 голос
/ 02 мая 2009

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

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

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

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

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

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

1 голос
/ 02 мая 2009

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

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

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

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

...