загрузка пера в фоновом потоке - PullRequest
1 голос
/ 13 февраля 2012

Я только что провел день, выискивая действительно странную ошибку. Это был переизданный UILabel, хотя в коде не было перевыпуска. Если я прокомментировал выпуск метки, код был в порядке.

Я отследил его до UIView, который был выпущен в фоновом потоке. Что не кажется правильным, так как вы должны получить доступ ко всем элементам пользовательского интерфейса из основного потока. Затем я нашел файл пера, который загружался в фоновом потоке, используя:

[[NSBundle mainBundle] loadNibNamed:@"nib name" owner:self options:nil];

Мне не нужно вдаваться в детали того, что делал код, но мой вопрос:

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

Я не знаю, но я решил это, обернув часть кода loadNibNamed в GCD-распределении синхронно в основной поток.

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Из статьи Майка Эша

Опасные звонки с какао

NSBundle У этого есть половина проблем NSHost. NSBundle возвращает разделяемые объекты, но не является потокобезопасным, поэтому это только основной поток. Это все еще безопасно использовать из основного потока. Причина, по которой я отмечаю его как опасный, заключается в том, что тот факт, что его использование из вторичных потоков небезопасно, на самом деле не задокументирован, а скорее вытекает из того факта, что он не безопасен для потоков, а также из-за того, что экземпляры являются общими, и это может заманчиво использовать его из других тем.

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

Все операции, связанные с пользовательским интерфейсом, должны выполняться из основного потока.

...