создание пула автоматического выпуска и дренирование его в другом контексте - PullRequest
3 голосов
/ 23 февраля 2012

В контроллере представления у меня есть UIImageView как подпредставление. На willRotateToInterfaceOrientation я заменяю его другим UIImageView. Если оба находятся в памяти одновременно, иногда происходит сбой, потому что изображения очень большие. Так что я хочу убедиться, что полностью освободил первый, прежде чем делать новый. Когда я вызываю на нем команду removeFromSuperview, я думаю, что через некоторое время она автоматически высвобождается, но мне нужно, чтобы она была немедленно отменена.

Таким образом, мне кажется, что мне нужен собственный пул автоматического выпуска при создании UIImageView, а затем слить его при вызове willRotateToInterfaceOrientation после вызова removeFromSuperview. Но в документации сказано:

Пул авторелизов всегда должен сливаться в одном и том же контексте (например, в качестве вызова метода или функции или тела цикла) в который был создан. Автозапускные пулы используются «встроенными». Там Как правило, не должно быть никаких причин, почему вы должны сделать пул авто-релиз переменная экземпляра объекта.

Так, каков "правильный" способ сделать это?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Лучше всего оптимизировать изображения. Крайне важно, чтобы пул авто-выпусков выделялся и сливался в одном и том же контексте. Первое, что вы должны попытаться уменьшить размер изображения. Если это png, попробуйте pngcrush. Если изображения все еще слишком велики, рассмотрите возможность использования mmap для одновременной загрузки частей изображения.

Настройка производительности

Наложение ограничений на размер ресурсов.
Старайтесь не загружать большой файл ресурсов, когда подойдет меньший. Вместо использования высокого разрешения изображение, используйте тот, который имеет соответствующий размер для устройств на базе iOS. Если Вы должны использовать большие файлы ресурсов, найти способы загрузить только часть файла, который вам нужен в любой момент времени. Например, а не загрузить весь файл в память, используйте функции mmap и munmap для отобразить части файла в и из памяти. Для дополнительной информации о сопоставлении файлов в памяти, см. Производительность файловой системы Руководство.

1 голос
/ 24 февраля 2012

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

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

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

...