2011-01-11 13 views
21

Czytałem coś w jakimś obcym kodem i chcę sprawdzić moje założenie:Czy @synchronized (self) tworzy blok, w którym samo prefix jest niepoprawny we właściwościach?

@synchronized(self) służy pozbyć przedrostka self podczas ustawiania właściwości.

W poniższym przykładzie ustawiam strText instancji, a nie tylko zmienną lokalną, prawda?

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

} 

Odpowiedz

39

Proszę przeczytać ten Documentation

Dyrektywa @synchronized() blokuje sekcję kodu do stosowania przez pojedynczego wątku. Inne wątki są blokowane, dopóki wątek nie wyjdzie z chronionego kodu - to znaczy, gdy wykonywanie będzie kontynuowane po ostatnim oświadczeniu w bloku .

Jako jedyny argument przyjęto dyrektywę @synchronized() o obiekcie Object-C , w tym self.

Jak Massimo Cafaro pointed out: „Jest to najbezpieczniejsza, aby utworzyć wszystkie obiekty wzajemnych wykluczeń przed aplikacja staje wielowątkowy, aby uniknąć warunków wyścigu”

+2

Link do dokumentacji jest już nieaktualny. Proszę odnieść się do tego: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057-CH8-SW1 – cescofry

+0

@cescofry, Tak, ten link był nieaktualny. Aktualizuję swoją odpowiedź za pomocą podanego linku. Dzięki. – Tirth

8

@synchronized (self) służy do pozbycia się siebie. prefiks.

Tak więc w moim przykładzie ustawiłem strText nie w funkcji, którą ustawiłem w klasie .

Dwie koncepcje są łączone.

  1. @synchronized(self) { ... } blokuje tylko blok przy użyciu obiektu self jako semafora.
  2. W Objective-C nie ma to jak hipotetyczne oświadczenie with jak w innych językach, które eliminuje potrzebę, aby self.whatever było tylko whatever. Może chcieć wziąć kurs online Stanford CS193P, aby odświeżyć język.
+7

Dlaczego ta odpowiedź? Może "odpowiedzieć" na to pytanie, ale - bez urazy - po prostu okazuje się, że jest lapidarny i nieprzydatny. –

+5

@synchronized nie ma wpływu na to, czy potrzebujesz "self". prefiks. Nie są w żaden sposób powiązane. –

+2

Jest to jedyna odpowiedź trzech, która faktycznie rozwiązuje nieporozumienie w pytaniu @Matt. Pozostali dwaj po prostu papugują dokumenty na temat '@synchronized()' –

Powiązane problemy