нужно ли освобождать память [NSFont systemFontOfSize] - PullRequest
1 голос
/ 27 ноября 2011

Я пытаюсь уменьшить объем памяти, используемой моим приложением во время выполнения ....

При стандартном использовании для получения шрифта на основе размера системного шрифта API используется как font = [NSFont systemFontOfSize]

+ (NSFont *)systemFontOfSize:(CGFloat)fontSize; // Aqua System font

В соответствии с моим пониманием, что font будет освобожден пулом автоматического выпуска, сначала я должен подтвердить, что это занижение является правильным?

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

Теперь опять это понимание верно? Есть 2 подхода

  • Найдите способ выпустить NSFont
  • Положите NSAutoReleasePool *pool. Распределить / отпустить там саму с рамкой

Что вы, ребята, предлагаете?

Ответы [ 4 ]

2 голосов
/ 27 ноября 2011

Имя функции systemFontOfSize: не начинается с каких-либо волшебных ключевых слов «alloc», «new», «copy» или «mutableCopy», поэтому вы не несете ответственности за освобождение того, что оно возвращает. Подробнее см. Основные правила управления памятью Какао .

0 голосов
/ 27 ноября 2011

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

Но мне, если вам часто нужно и возражать, я бы кешировал его в свойстве.
Создание и удаление обходятся дороже, чем чтение свойства.

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

0 голосов
/ 27 ноября 2011

Вы правы в обоих пунктах.По соглашению, все именованные инициализаторы возвращают автоматически выпущенные объекты.Поскольку вы (область действия drawWithFrame) не выделяли font, вы не несете ответственности за его освобождение.Как вы предложили, это может быть optimizated кладя autorelease бассейн вокруг него.
1005 * Wether или не выгода стоит дополнительного типирование работа кодера является дискуссионной.

0 голосов
/ 27 ноября 2011

Как и в большинстве не-init-методов, которые возвращают объект («всплывающее» - исключение, которое приходит на ум), объект, возвращаемый systemFontOfSize, автоматически высвобождается, и поэтому он будет освобожден в какой-то момент (очень близко) будущее.

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

Редактировать: я просто перечитал, понял, что вы создаете шрифт каждый раз, так что 2-й абзац не так важен для вашего вопроса, но в любом случае, если шрифт не должен меняться много раз в секунду, я бы посчитал создание объекта шрифта вне метода drawrect. Я не знаю, какой практический эффект это окажет на ваш текущий FPS / отзывчивость, но в целом хорошо привыкнуть к тому, чтобы не выполнять такие вещи, как создание объектов с избыточностью несколько раз в циклах и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...