Создает ли @synchronized (self) блок, в котором собственный префикс не нужен для свойств?
Я кое-что прочитал в каком-то внешнем коде, и я хочу проверить свое предположение:
@synchronized(self)
используется, чтобы избавиться от префикса self
при настройке свойства.
Итак, в моем примере ниже я устанавливаю strText
экземпляра, а не только локальную переменную, правильно?
- (void)myfunction{
NSString * strText = @"var in function";
@synchronized(self)
{
strText = @"var class (self.strText)";
}
}
Ответы
Ответ 1
Пожалуйста, прочтите это Documentation
Директива @synchronized()
блокирует раздел кода для использования одиночный поток. Другие потоки блокируются, пока нить не выйдет из защищенный код, то есть когда выполнение продолжается до последнего в блоке @synchronized()
.
Директива @synchronized()
принимает в качестве единственного аргумента любой Objective-C объект, включая self
.
Как Массимо Кафаро отметил:
"Самое безопасное создание всех объектов взаимного исключения до того, как приложение станет многопоточным, чтобы избежать условий гонки".
Ответ 2
@synchronized (self) используется, чтобы избавиться от себя. Приставка.
Итак, в моем примере я установил strText не в функцию, которую я установил в класс.
Две концепции объединяются.
-
@synchronized(self) { ... }
только блокирует блок, используя объект self
в качестве семафора.
- В Objective-C нет ничего похожего на гипотетический оператор
with
, как на других языках, который устраняет необходимость в self.whatever
просто whatever
. Можете взять онлайн-курс Stanford CS193P, чтобы освежить этот язык.
Ответ 3
В многопоточной среде, если более одного потока пытается получить доступ к одному и тому же адресу памяти, может возникнуть "условие гонки", чтобы избежать такого рода условий, вы должны использовать "Mutex Lock (Mutual Exclusion)" только блокировку, ограничение или блокировку n числа потоки для доступа к одному и тому же адресу памяти или содержимому в одно и то же время и разрешению только одного потока в один момент времени. Это может быть достигнуто в Objective C с помощью директивы @synchronized.
Пример: как правило, при реализации шаблона или класса разработки Singleton вы увидите некоторый фрагмент кода, как показано ниже в любых проектах iOS,
+(id)getSingletonInstance
{
@synchronized(self)
{
if (singletonObj == nil)
{
singletonObj = [[self alloc] init];
}
return singletonObj;
}
}