Подтвердить что ты не робот

Создает ли @synchronized (self) блок, в котором собственный префикс не нужен для свойств?

Я кое-что прочитал в каком-то внешнем коде, и я хочу проверить свое предположение:

@synchronized(self) используется, чтобы избавиться от префикса self при настройке свойства.

Итак, в моем примере ниже я устанавливаю strText экземпляра, а не только локальную переменную, правильно?

- (void)myfunction{
    NSString * strText = @"var in function";
    @synchronized(self)
    {
         strText = @"var class (self.strText)";
    }

}
4b9b3361

Ответ 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;
    }
}