2009-08-14 5 views
17

В Objective-C вы можете объявить блок как синхронизированный на каком-либо объекте, используя конструкцию @synchronized. Это будет выглядеть примерно так:@synchronized в статическом методе

@synchronized (self) { 
    // Do something useful 
} 

Однако, мне очень интересно, что именно self имеет в виду, когда у вас есть статический метод (+ вместо -). Я пробовал просматривать документы Apple, и они намекают, что все в порядке, но на самом деле это не объясняет. Я знаю, что это работает, мне просто интересно, что это значит.

ответ

26

self внутри класса (статического) метода относится к объекту класса.

+0

спасибо. Я знаю, что было что-то простое, что мне не хватало. – Itay

+4

Остерегайтесь того, что @synchronized (self) в методе класса может быть опасным, потому что для подкласс класса является другим объектом (классом), поэтому все же может быть одновременный доступ к методу между этими двумя классами –

13

В Objective-C self определяется по контексту. В методе экземпляра это будет вызванный экземпляр. В статическом методе это был бы сам объект класса (т. Е. Результат [self class] в методе экземпляра)

0

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

Смежные вопросы