Подтвердить что ты не робот

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

Возможные дубликаты:
Изучите управление памятью Obj-C
Где лучшие объяснения управления памятью для iPhone?

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

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

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

4b9b3361

Ответ 1

Здесь вы переходите:

Управление памятью приложений - это процесс выделения памяти во время выполнения вашей программы, ее использования и освобождения, когда вы закончите с ней. Хорошо написанная программа использует как можно меньше памяти. В Objective-C он также может рассматриваться как способ распределения права собственности на ресурсы ограниченной памяти среди многих частей данных и кода. Когда вы закончите работу с этим руководством, у вас будут знания, необходимые для управления памятью приложений, путем явного управления жизненным циклом объектов и освобождения их, когда они больше не нужны.

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

Вот правила:

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

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

NSObject *threeObjects[3];

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

Причины использования NSArray:

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

    [threeObjects[0] length]

Ответ 7

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

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

Ответ 8

Например, полностью ли запрещено использовать указатель на объект Objective C и рассматривать его как массив?

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

Вы вынуждены использовать NSArray и NSMutableArray для структур данных?

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

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

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

Ответ 9

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

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

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

Ответ 10

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