UIImagePickerControllerSourceTypeCamera hogging память

Вы можете делать то, что вам нужно, с помощью find, который ищет все *.jpg файлов, и простого сценария помощника , вызываемого опцией -exec для find для создания каталога jpg и переместите все файлы .jpg в новый каталог.

Вспомогательный скрипт просто получает абсолютное имя файла, используя readlink -f и затем используя быстрое расширение параметра , чтобы обрезать последний компонент /... из абсолютного имени файла, чтобы получить полный путь. Тогда это просто вопрос создания каталога jpg в конце пути и перемещения файла в новый каталог.

Ваш вспомогательный скрипт (я назвал его helper.sh) может быть:

#!/bin/sh

test -z "$1" && exit                        ## validate 1 argument given or exit

full=$(readlink -f "$1")                    ## get full filename
dir="${full%/*}"                            ## get full path

test "${full##*.}" = 'jpg' || exit          ## test extension is jpg or exit

test -z "$dir" && dir="/"                   ## check if file was in / (root) 

test -d "$dir/jpg" || mkdir -p "$dir/jpg"   ## check/create jpg dir at end of path

mv "$full" "$dir/jpg"                       ## move file into new jpg dir

( примечание: после создания вспомогательного сценария убедитесь, что вы делаете его исполняемым) с chmod +x helper.sh)

Дерево каталогов исходных проектов

$ tree Projects/
Projects/
├── Project_001
│   └── Image_001.jpg
├── Project_002
│   ├── Image_002.jpg
│   └── Image_003.jpg
└── Project_003

Ваша команда find работает в каталоге Projects, вызывая вспомогательный сценарий для каждый файл будет выглядеть следующим образом:

$ find Projects/ -type f -name "*jpg" -exec ./helper.sh '{}' \;

Дерево каталогов результирующих проектов

$ tree Projects/
Projects/
├── Project_001
│   └── jpg
│       └── Image_001.jpg
├── Project_002
│   └── jpg
│       ├── Image_002.jpg
│       └── Image_003.jpg
└── Project_003

Дайте мне знать, если у вас есть дополнительные вопросы.

Сохранение файлов уже в каталоге jpg

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

test "${dir##*/}" = 'jpg' && exit           ## if already in jpg dir, exit

Показано в контексте в helper.sh:

test -z "$1" && exit                        ## validate 1 argument given or exit

full=$(readlink -f "$1")                    ## get full filename
dir="${full%/*}"                            ## get full path (trim last /*)

test "${dir##*/}" = 'jpg' && exit           ## if already in jpg dir, exit
test "${full##*.}" = 'jpg' || exit          ## test extension is jpg or exit
...

Дерево каталогов оригинальных проектов (с существующим jpg)

$ tree Projects/
Projects/
├── Project_001
│   ├── Image_001.jpg
│   └── jpg
│       └── Image_000.jpg
├── Project_002
│   ├── Image_002.jpg
│   ├── Image_003.jpg
│   └── jpg
│       ├── Image_000.jpg
│       └── Image_001.jpg
└── Project_003

[1146 Дерево каталогов результирующих проектов

$ tree Projects/
Projects/
├── Project_001
│   └── jpg
│       ├── Image_000.jpg
│       └── Image_001.jpg
├── Project_002
│   └── jpg
│       ├── Image_000.jpg
│       ├── Image_001.jpg
│       ├── Image_002.jpg
│       └── Image_003.jpg
└── Project_003
5
задан GEOCHET 19 February 2009 в 15:40
поделиться

3 ответа

UIImagePickerController пропускает память, как отмечено hereand после 7 или 8 причин использования Ваше приложение для катастрофического отказа. Необходимо создать одиночный элемент UIImagePickerController для срока действия приложения для предотвращения этого дефекта Apple.

2
ответ дан 14 December 2019 в 19:27
поделиться

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

Это относительно самого средства выбора изображения, все же. Другая часть вопроса - то, что Вы делаете с объектами UIImage, которые что это возвращает Вам. Это - большие объекты по стандартам iPhone, и Вы действительно не можете позволить себе сохранить многих из них в памяти. Если Вы отображаете изображение, это - жизнь, но изображения, которые не являются экранными, могут быть безопасно разгружены в файл через UIImageJPEGRepresentation () и writeToFile:atomically: NSDATA.

Если действительно необходимо отобразить несколько изображений, рассмотрите уменьшение масштаба их. Камера 1600x1200 является уже намного более крупной, чем экран, и с несколькими экранными изображениями это еще более чрезмерно. Масштабирование для понижения разрешений уменьшает требования к памяти существенно. Пример кода для того, чтобы сделать это не трудно найти - видят, что предварительный просмотр камеры UIImagePickerController является портретом в альбомном приложении, например.

3
ответ дан 14 December 2019 в 19:27
поделиться

Я знаю, что этот ответ после факта, но у меня был тот же тип проблемы, которая разрешила сам путем соединения против iPhone SDK 2.2 и больше.

0
ответ дан 14 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: