Есть ли эквивалент -applicationDidReceiveMemoryWarning: на Mac - PullRequest
6 голосов
/ 03 октября 2009

Я ищу эквивалент -(void)applicationDidReceiveMemoryWarning:(UIApplication *)application метода, который доступен на iPhone. До сих пор я не смог ничего найти, но я хотел бы проверить, прежде чем начать писать свои собственные.

Ответы [ 5 ]

8 голосов
/ 03 октября 2009

Память в Mac OS X не работает так же, как OS X Touch. Примечательно, что настольный компьютер имеет гораздо больше оперативной памяти и подменяет память на диск, поскольку приложения требуют больше. Кроме того, есть много приложений, конкурирующих за ресурсы.

Реальный вопрос: что вы пытаетесь достичь?

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

Однако, если ответ более схож с У меня есть подсистема кэширования, которая выигрывает от большого объема памяти, но я хочу вернуть ее системе, когда другие приложения увеличивают свои требования , тогда вам нужно изучить поддержку Кеширования и очистки памяти Snow Leopard .

Примечательно, что два API предоставляют средства для агрессивного кэширования данных, если они являются системными ресурсами, выполняют резервное копирование или возвращают системе, когда они испытывают нехватку памяти.

2 голосов
/ 03 октября 2009

Пусть ядро ​​беспокоится об управлении памятью.

iPhone не использует виртуальную память, поэтому его ограничения памяти очень конкретны. Единственное, что есть у ядра, - это предупредить вас, прежде чем оно в конце концов уничтожит вас. Вот почему у iPhone есть предупреждения о памяти.

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

0 голосов
/ 03 октября 2018

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

let a = DispatchSource.makeMemoryPressureSource(
    eventMask: [.warning], queue: .main)
a.setEventHandler(handler: {
    print("memory warning!")
})
a.resume()

Хотя я не проверял этот код, работает ли он на самом деле или нет.

0 голосов
/ 03 октября 2009

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

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

0 голосов
/ 03 октября 2009

Я думаю, вы можете разумно ожидать, что большинство современных компьютеров Mac будут иметь как минимум 1 ГБ ОЗУ (возможно, 2, а может и даже 4+). Если ваше приложение вызывает ошибки malloc и / или не хватает памяти, значит, вы сделали не так, и вам нужно переосмыслить то, что вы храните в памяти.

Итак, в двух словах, нет, нет. Mac не так ограничен в памяти, как iPhone, поэтому в этом нет необходимости.

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