Управление памятью в Objective-C

Possible Duplicates:
Learn Obj-C Memory Management
Where are the best explanations of memory management for iPhone?

Я вырос в C / C++, и динамический характер Objective-C мне несколько чужд. Есть ли хороший ресурс, на который можно указать мне некоторые базовые методы управления памятью в Objective-C? бывший. удержание, отпускание, автоспуск

Например, совершенно ли незаконно использовать указатель на объект Objective-C и рассматривать его как массив? Вы вынуждены использовать NSArray и NSMutableArray для структур данных?

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

Ничего общего с iPhone, пожалуйста, измените название.

Chris Hanson 20.09.2008 06:02

это важная часть правильного ответа, поскольку в приложениях Cocoa на iPhone нет сборки мусора, но в приложениях Mac OS X Cocoa есть.

Paul Dixon 29.09.2008 00:57

Mac OS X имеет необязательную сборку мусора; это ясно из вопроса, который задает разработчик об управлении памятью, отличной от GC.

Chris Hanson 01.10.2008 11:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
3
13 606
10

Ответы 10

Ну вот:

Application memory management is the process of allocating memory during your program’s runtime, using it, and freeing it when you are done with it. A well-written program uses as little memory as possible. In Objective-C, it can also be seen as a way of distributing ownership of limited memory resources among many pieces of data and code. When you have finished working through this guide, you will have the knowledge you need to manage your application’s memory by explicitly managing the life cycle of objects and freeing them when they are no longer needed.

Although memory management is typically considered at the level of an individual object, your goal is actually to manage object graphs. You want to make sure that you have no more objects in memory than you actually need...

Если это массив, не стесняйтесь выполнять итерацию с указателем. Обычные массивы по-прежнему управляются C. Если это NSArray, прочтите документацию NSArray. Если они говорят делать это определенным образом, делайте это так. Когда вы пишете для OS X, делайте это по книге.

Objective-C - это просто надмножество C. Все, что вы можете делать в C, действительно и в Objective-C.

Конечно, вы можете использовать массивы и самостоятельно управлять памятью. Самый большой компонент заключается в том, что если вы создаете что-либо, являющееся подклассом NSObject, и вы создаете его с помощью метода [XXX alloc], или если вы получаете это из другой копии с помощью [xxx copy], то вы обязаны сопоставьте это с соответствующим выпуском.

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

Ссылка http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html содержит все подробности и определенно является первым местом, которое нужно прочитать.

Вероятно, также полезно отметить, что для сообщений класса, таких как NSString + (NSString *) stringWithFormat: (в основном, вспомогательные сообщения, которые выделяют объект для вас, а не требуют, чтобы вы выделяли объект самостоятельно), результирующий объект автоматически освобождается, если вы явно сохранить его.

Вот правила:

  1. Если вы создаете объект, вызывая alloc или copy, вы являетесь его владельцем и должны иметь его release, когда закончите.
  2. Если вы не создавали объект, но хотите, чтобы он оставался до того, как управление вернется в цикл выполнения (или, для простоты, ваш метод вернется), отправьте ему сообщение retain, а затем release его позже, когда вы ' повторно сделано.
  3. Если вы создаете объект и хотите вернуть его из своего метода, вы обязаны освободить его, но вы не хотите уничтожать его до того, как вызывающий объект получит возможность его увидеть. Вместо этого вы отправляете его autorelease, который помещает его в пул автозапуска, который очищается, когда управление возвращается в цикл обработки событий программы. Если никто не оставит объект себе, он будет освобожден.

Что касается массивов, вы можете сделать что-то вроде этого:

NSObject *threeObjects[3];

threeObjects[0] = @"a string";
threeObjects[1] = [NSNumber numberWithInt:2];
threeObjects[2] = someOtherObject;

Причины использования NSArray в любом случае:

  • NSArray позаботится о сохранении объектов при их добавлении и освобождении при их удалении, тогда как в простом массиве C вам придется делать это самостоятельно.
  • Если вы передаете массив в качестве параметра, NSArray может сообщать количество объектов, которые он содержит, с простым массивом C вам также необходимо передать счетчик.
  • Смешивать значения квадратных скобок в одной строке кажется странным:

    [threeObjects[0] length]

Приведенные здесь правила являются неполными (без учета копировать и новых * шаблонов владения) - см. Документацию Apple для получения полных правильных правил.

mmalc 03.10.2008 19:32

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

mmalc 03.10.2008 19:34

Обычно бесполезно повторять основные правила управления памятью, так как почти всегда вы делаете ошибку или описываете их не полностью - как в случае с ответами, предоставленными 'heckj' и 'benzado' ...

Основные правила управления памятью представлены в документации Apple в Правила управления памятью.

По поводу ответа от «www.stray-bits.com»: утверждение, что объекты, возвращаемые из «не принадлежащих» методов, «автоматически выпускаются», также в лучшем случае вводит в заблуждение. Обычно вам не следует думать о том, является ли что-то «автоматически выпущенным», а просто учитывать правила управления памятью и определять, владеете ли вы по этим соглашениям возвращенным объектом. Если вы это сделаете, вам нужно отказаться от владения ...

Один противоположный пример (мышление в терминах автоматически выпущенных объектов) - это когда вы рассматриваете проблемы производительности, связанные с такими методами, как stringWithFormat:. Поскольку вы обычно (1) не имеете прямого контроля над временем жизни этих объектов, они могут сохраняться в течение сравнительно долгого времени и излишне увеличивать объем памяти, занимаемый вашим приложением. В то время как на настольных компьютерах этот май не имеет большого значения, на более ограниченных платформах это может быть серьезной проблемой. Поэтому на всех платформах рекомендуется использовать шаблон alloc / init, а на более ограниченных платформах, где это возможно, настоятельно не рекомендуется использовать какие-либо методы, которые могут привести к автоматическому выпуску объектов.

(1) Вы можете взять под контроль свои собственные локальные пулы с автоматическим выпуском. Подробнее об этом см. Руководство по программированию управления памятью Apple.

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

benzado 02.10.2008 04:51

Когда я впервые добавил свой ответ, у меня не было достаточно очков для комментариев ...

mmalc 03.10.2008 19:28

Если вы используете массив в стиле C для хранения объектов и решите использовать сборку мусора, вам нужно будет выделить эту память с помощью NSAllocateCollectable(sizeof(id)*size, NSScannedOption) и пометить эту переменную как __strong.

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

For instance, is it completely illegal to use a pointer to an Objective C object and treat it as an array?

Если это не массив, то да.

Are you forced to use NSArray and NSMutableArray for data structures?

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

Но нет причин не использовать NS{,Mutable}Array. Не бойтесь фреймворков Cocoa, потому что они ваши друзья.

И не забывайте о других типах коллекций, таких как NS{,Mutable}Set и NS{,Mutable}Dictionary.

Итерация массивов C выполняется намного быстрее. Конечно, нет причин для оптимизации, пока не возникнет необходимость в оптимизации. Также, чтобы уточнить, вы можете ссылаться на объекты Objective-C, используя массив указателей (стиль C).

user234736 09.01.2012 01:03

Как еще один новичок, я нашел лекции Стэнфорда по iOS очень полезными: http://itunes.apple.com/itunes-u/developing-apps-for-ios-hd/id395605774

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

Я определенно думаю, что это одна из тех тем, которые вам нужно изучать и переучивать через разные источники… просто чтобы вбить ее себе в голову.

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