Использование @synchronized (self) {...} в функции класса - PullRequest
10 голосов
/ 22 марта 2012

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

+(void)someFunction {
    @synchronized(self) {
         /* some code */
    }
}

Вроде бы правильный код, по крайней мере компилятор не дает мне плохих отзывов. Мой вопрос: что здесь self? Насколько я могу судить, блок @synchronized не работал, но он тоже не падал.

Я просто спрашиваю из любопытства.

Ответы [ 4 ]

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

self в данном случае относится к классу, а не к экземпляру.В ObjC классы сами являются объектами.

4 голосов
/ 22 марта 2012

self в этом контексте - это сам класс, прекрасно использовать @synchronized в функции класса, поскольку они также являются объектами Objective-C.

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

Синтаксис @synchronized является расширением компилятора для реализации мьютекса. Я полагаю, вы поняли , что он делает . Компилятор переведет его во что-то другое, предположительно что-то похожее на критическую секцию , потому что он менее загружен процессором. Замки нужно отслеживать. Реализация будет использовать объект для записи состояния блокировки, чтобы сохранить ее целостность (то есть блокировка не должна быть получена дважды или разблокирована дважды).

В @synchronized(self) объект не обязательно должен быть self. Это может быть любой объективный объект. Обратите внимание, что один блок @synchronized обычно ничего не делает (когда вы упоминали, что он не работает, он на самом деле ведет себя правильно). Но когда у вас есть два блока @synchronized на одном и том же объекте 1013 *, одновременно будет выполняться только один блок, другому блоку придется ждать разблокировки блокировки (т.е. первый блок завершается ). Это помогает поддерживать синхронизацию, как в многопоточной среде.

0 голосов
/ 22 марта 2012

В методе класса self - это класс, к которому вызывается метод. Например, вы можете вызывать другие методы класса того же класса, используя self. [MyClass someFunction] и [self someFunction] будет эквивалентно рекурсивному вызову someFunction. Блок @synchronized, я уверен, работал так, как и предполагалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...