Создает ли @synchronized (self) блок, в котором префикс self не нужен для свойств? - PullRequest
21 голосов
/ 11 января 2011

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

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

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

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

}

Ответы [ 3 ]

41 голосов
/ 11 января 2011

Пожалуйста, прочтите это Документация

Директива @synchronized() блокирует часть кода для использования одна нить Другие потоки блокируются, пока поток не выйдет из защищенный код, то есть когда выполнение продолжается после последнего оператор в блоке @synchronized().

Директива @synchronized() принимает в качестве единственного аргумента любую Объект Objective-C, включая self.

Как Массимо Кафаро указал : «Безопаснее создавать все объекты взаимного исключения до того, как приложение станет многопоточным, чтобы избежать условий гонки».

8 голосов
/ 30 июля 2012

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

Так что в моем примере я установил strText не в функции, которую я установил в классе.

Две концепции объединяются.*@synchronized(self) { ... } блокирует только блок, используя объект self в качестве семафора.

В Objective-C нет ничего похожего на гипотетический оператор with, как в других языках, который устраняет необходимость в self.whatever быть просто whatever.Возможно, вы захотите пройти онлайн-курс по Stanford CS193P, чтобы освежить язык.
0 голосов
/ 29 января 2019

В многопоточной среде, если более одного потока пытается получить доступ к одному и тому же адресу памяти, может возникнуть «состояние гонки», чтобы избежать таких условий, вы должны использовать «Mutex Lock (Mutual Exclusion)» только блокирование илиограничение или блокировка n потоков для доступа к одному и тому же адресу или содержимому памяти в один и тот же момент времени и разрешение только одного потока в один момент времени.Это может быть достигнуто в Objective C с помощью директивы @synchronized.

Пример: Как правило, при реализации шаблона или класса разработки Singleton вы увидите некоторый фрагмент кода, как показано ниже в любых проектах iOS,

+(id)getSingletonInstance
{
    @synchronized(self)
    {
        if (singletonObj == nil)
        {
            singletonObj = [[self alloc] init];
        }
        return singletonObj;
    }
}
...