Какова стоимость использования автореферата в cocoa?

Большинство документации на яблоки, по-видимому, не позволяют использовать автореализованные объекты, особенно при создании представлений gui, но я хочу знать, какова стоимость использования автореализованных объектов?

UIScrollView *timeline = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 20, 320, 34)]; [self addSubview:timeline]; [timeline release]; 

В конечном итоге следует использовать страtagsю, в которой все автореализован, и использование сохранения / выпуска должно быть исключением из правила для конкретных случаев? Или вообще я должен использовать сохранение / освобождение с авторекламой, являющейся исключением для возвращаемых объектов из удобных методов, таких как [NSString stringWithEtc …]?

Существует две издержки:

  1. (Предполагая, что у вас есть возможность избежать автореализованных объектов.) Вы фактически излишне увеличиваете срок службы ваших объектов. Это может означать, что ваш объем памяти растет – излишне. На ограниченной платформе это может означать, что ваше приложение прекращается, если оно превышает лимит. Даже если вы не превысите лимит, это может привести к тому, что ваша система начнет свопинг, что очень неэффективно.

  2. Дополнительные накладные расходы на поиск текущего пула авторесурсов, добавление к нему объекта автореализованного доступа, а затем освобождение объекта в конце (вызов дополнительного метода). Это может не быть большими накладными расходами, но это может сложить.

Лучшая практика на любой платформе – попытаться избежать авторекламы, если сможете.

Чтобы ответить на вопросы:

В конечном итоге следует использовать страtagsю, в которой все автореализован, и использование сохранения / выпуска должно быть исключением из правила для конкретных случаев?

Наоборот.

Или вообще я должен использовать сохранение / освобождение с авторекламой, являющейся исключением для возвращаемых объектов из удобных методов, таких как [NSString stringWithEtc …]?

Вы всегда должны использовать сохранение / освобождение, если можете – в случае NSString как правило, нет необходимости использовать методы stringWithEtc поскольку существуют эквиваленты initWithEtc .

См. Также этот вопрос .

Я должен не согласиться с Джимом Пулсом – я думаю, что использование Autorelease не делает отладку более сложной, потому что вы, скорее всего, случайно попадаете в память. Конечно, статический анализатор Clang может забрать некоторые из этих случаев, но для меня небольшие накладные расходы, обычно использующие autorelease, намного омрачены тем, что мой код менее подвержен ошибкам.

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

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

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

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

Хотя есть потеря эффективности, в большинстве случаев это не имеет значения. Большая проблема заключается в том, что объекты с более длинными объектами и последующее восстановление памяти могут привести к более fragmentированному адресному пространству. Если это проблема, обычно довольно просто входить и переключиться на ручное сохранение / освобождение несколькими горячими методами и улучшить его.

Как говорили другие, показатели удобочитаемости превосходят производительность в неудовлетворительном коде. Существует ряд случаев, когда использование автореализованных объектов приводит к большей fragmentации памяти, но в любом случае, когда объект перейдет в пул, этого не произойдет. В этих случаях единственная цена, которую вы платите, – это найти стоимость поиска правильного пула авторефератов.

Одно из преимуществ использования пулов автоопределений состоит в том, что они являются безопасными для исключения без использования @try / @finally . Грэг Паркер («Mr. Objective-C») имеет отличный пост, объясняющий детали этого.

Я autorelease использую autorelease поскольку это меньше кода и делает его более читаемым, IMO. Недостаток, как указывали другие, заключается в том, что вы увеличиваете время жизни объектов, тем самым временно используя больше памяти. На практике мне еще предстоит найти чрезмерное использование autorelease чтобы стать важной проблемой в любом приложении Mac, которое я написал. Если использование большой памяти кажется проблемой (это не вызвано подлинной утечкой), я просто добавляю больше пулов автоопределения (после профилирования, чтобы показать мне, где они мне нужны). Но, в общем, это довольно редко. Как показывает сообщение Майка Эша (связанный с ним Грэм Ли), пулы авторефератов имеют очень мало накладных расходов и быстры. Существует почти нулевая стоимость добавления дополнительных пулов автоопределения.

Конечно, это все для приложений Mac. В приложениях iPhone, где память более жесткая, вы можете быть консервативны при использовании авторекламы. Но, как всегда, сначала напишите читаемый код, а затем оптимизируйте его позже, измерив, где находятся медленные / интенсивные части памяти.

Стоимость:

  1. Время, чтобы найти пул авторесурсов текущего streamа и добавить к нему объект.
  2. Память, занимаемая объектом, пока не будет выпущена в какой-то более поздней точке.

Если вы хотите быть очень консервативным с использованием вашей памяти, вам следует избегать автоматического оповещения. Однако это полезный метод, который может сделать код более читаемым. Навязчиво используя сохранение / освобождение подпадает под «преждевременную оптимизацию».

Если вы используете основной stream обработки Cocoa (который вы используете большую часть времени), пул автозапуска пуст, когда управление возвращается обработчику событий. Если ваш метод является коротким и не зацикливается на больших объемах данных, использование autorelease для отсрочки освобождения в конце цикла запуска является прекрасным.

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

Если вы не можете избежать автореализаций внутри цикла (это делается с помощью кода, который вы не писали и не можете изменить), вы также можете самостоятельно управлять NSAutoreleasePool внутри цикла, если это необходимо.

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

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

Другие ответили, должны ли вы авторейтинг, но когда вы должны авторейтинг, слейте раньше и часто откачивайте: http://www.mikeash.com/?page=pyblog/autorelease-is-fast.html

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

Одно замечание, которое нужно иметь в виду, это если вы создаете новый stream, вы должны настроить новый пул авторесурсов в этом streamе, прежде чем делать что-либо еще. Даже если вы не используете объекты автообновления, возможно, что-то в API Cocoa.

Старая нить, но чиппинг в интересах новых читателей.

Я использую autorelease vs keep / release в зависимости от риска ошибок автообновления, специфичных для объекта, и размера объекта. Если я просто добавлю несколько маленьких UIImageViews или пару UILabels к моему представлению, autorelease сохраняет код читаемым и управляемым. И когда представление удалено и отменено, эти подпункты должны быть выпущены достаточно скоро.

Если, с другой стороны, мы говорим об UIWebView (высокий риск ошибок автозапуска) или, конечно, некоторые данные, которые должны быть постоянными до «смерти» объекта, сохранить / освободить – это путь.

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

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

  • bds 2006 C конфликты с скрытым диспетчером памяти (class new / delete vs. AnsiString)
  • Что произойдет, если я попытаюсь получить доступ к памяти за пределами области malloc ()?
  • Почему происходит сбой этой программы: передача std :: string между DLL
  • В чем разница между новыми / delete и malloc / free?
  • Как я могу получить местоположение памяти объекта в java?
  • Можно ли использовать «classic» malloc () / free () в приложениях Objective-C / iPhone?
  • Каковы некоторые примеры практики управления памятью Java?
  • Объем памяти типов данных Haskell
  • Как мне получить AppContext для выпуска компонентов AWT, чтобы они могли собирать мусор?
  • Сравнение использования памяти в браузере: встроенный onClick против использования JQuery .bind ()
  • Сведения о переполнении памяти Linux
  • Давайте будем гением компьютера.