#iphone #thread-safety #uiimage
#iPhone #потокобезопасность #uiimage
Вопрос:
В ios3 (3.1.2 и выше) является ли потокобезопасным доступ к следующим свойствам?
- UIImage.size
- UIImage.CGColor — редактировать: упс, это должно быть UIImage.CGImage
- UIColor.CGColor
Спасибо
Ответ №1:
Все эти свойства объявлены как nonatomic
, что означает, что у них нет гарантий многопоточного доступа. Вы, конечно, можете получить доступ к этим свойствам в нескольких потоках, но вы делаете это на свой страх и риск.
Вот документация по этому поводу. Если бы свойства были объявлены без nonatomic
, то во время получения и установки значения использовалась бы блокировка, гарантирующая, что только один поток обращался к значению одновременно. Как и следовало ожидать, это приводит к небольшому снижению производительности. Когда свойство объявлено как nonatomic
, это просто означает, что блокировка не используется. Вы можете получить и установить значение свойства из любого потока, который вам нравится. Однако, как и при любом многопоточном доступе к значению, существует вероятность конфликта потоков из-за этого свойства, что может (при некоторых обстоятельствах) привести к неопределенному поведению.
Обычно, однако, вам не нужно слишком беспокоиться об этом. Это действительно относится только к свойствам, значения которых могут быть установлены из нескольких потоков. Все интересующие вас свойства ( UIImage.size
, UIImage.CGImage
, UIColor.CGColor
) объявлены как readonly
, что означает, что на самом деле не о чем беспокоиться при доступе к этим значениям из нескольких потоков, одновременно или иным образом.
Комментарии:
1. вау, спасибо, не знал, что я могу так интерпретировать «неатомный». Есть ли способ получить потокобезопасный способ определения размера UIImage?
2. можно ли получить доступ к этим свойствам из неосновного потока, если к нему обращается один поток? или это совершенно неправильно обращаться к ним из неосновного потока?