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 для структур данных?
Я знаю, что это вопросы для новичков, спасибо за любую помощь, которую вы можете мне предложить.
это важная часть правильного ответа, поскольку в приложениях Cocoa на iPhone нет сборки мусора, но в приложениях Mac OS X Cocoa есть.
Mac OS X имеет необязательную сборку мусора; это ясно из вопроса, который задает разработчик об управлении памятью, отличной от GC.





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: (в основном, вспомогательные сообщения, которые выделяют объект для вас, а не требуют, чтобы вы выделяли объект самостоятельно), результирующий объект автоматически освобождается, если вы явно сохранить его.
Вот правила:
alloc или copy, вы являетесь его владельцем и должны иметь его release, когда закончите.retain, а затем release его позже, когда вы ' повторно сделано.autorelease, который помещает его в пул автозапуска, который очищается, когда управление возвращается в цикл обработки событий программы. Если никто не оставит объект себе, он будет освобожден.Что касается массивов, вы можете сделать что-то вроде этого:
NSObject *threeObjects[3];
threeObjects[0] = @"a string";
threeObjects[1] = [NSNumber numberWithInt:2];
threeObjects[2] = someOtherObject;
Причины использования NSArray в любом случае:
Смешивать значения квадратных скобок в одной строке кажется странным:
[threeObjects[0] length]
Приведенные здесь правила являются неполными (без учета копировать и новых * шаблонов владения) - см. Документацию Apple для получения полных правильных правил.
Утверждение, что «помещает его в пул автозапуска, который очищается, как только управление возвращается в цикл обработки событий программы», не обязательно правильно. Автоматически выпущенные объекты добавляются в текущий пул с наибольшим количеством автозапусков, который может быть локальным для метода или потока.
Обычно бесполезно повторять основные правила управления памятью, так как почти всегда вы делаете ошибку или описываете их не полностью - как в случае с ответами, предоставленными 'heckj' и 'benzado' ...
Основные правила управления памятью представлены в документации Apple в Правила управления памятью.
По поводу ответа от «www.stray-bits.com»: утверждение, что объекты, возвращаемые из «не принадлежащих» методов, «автоматически выпускаются», также в лучшем случае вводит в заблуждение. Обычно вам не следует думать о том, является ли что-то «автоматически выпущенным», а просто учитывать правила управления памятью и определять, владеете ли вы по этим соглашениям возвращенным объектом. Если вы это сделаете, вам нужно отказаться от владения ...
Один противоположный пример (мышление в терминах автоматически выпущенных объектов) - это когда вы рассматриваете проблемы производительности, связанные с такими методами, как stringWithFormat:. Поскольку вы обычно (1) не имеете прямого контроля над временем жизни этих объектов, они могут сохраняться в течение сравнительно долгого времени и излишне увеличивать объем памяти, занимаемый вашим приложением. В то время как на настольных компьютерах этот май не имеет большого значения, на более ограниченных платформах это может быть серьезной проблемой. Поэтому на всех платформах рекомендуется использовать шаблон alloc / init, а на более ограниченных платформах, где это возможно, настоятельно не рекомендуется использовать какие-либо методы, которые могут привести к автоматическому выпуску объектов.
(1) Вы можете взять под контроль свои собственные локальные пулы с автоматическим выпуском. Подробнее об этом см. Руководство по программированию управления памятью Apple.
Прокомментируйте мой ответ, если у меня что-то не так, чтобы я мог исправить это или, по крайней мере, другие люди знали, что не так.
Когда я впервые добавил свой ответ, у меня не было достаточно очков для комментариев ...
Если вы используете массив в стиле 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).
Как еще один новичок, я нашел лекции Стэнфорда по iOS очень полезными: http://itunes.apple.com/itunes-u/developing-apps-for-ios-hd/id395605774
Это хорошо, потому что показывает концепции в действии с помощью демонстраций, и я обычно нахожу, что кто-то разговаривает со мной лучше, чем просто чтение.
Я определенно думаю, что это одна из тех тем, которые вам нужно изучать и переучивать через разные источники… просто чтобы вбить ее себе в голову.
Ничего общего с iPhone, пожалуйста, измените название.