2009-08-14 17 views
17

In Objective-C können Sie einen Block als synchronisiert auf ein Objekt deklarieren, indem Sie das Konstrukt @synchronized verwenden. Es würde wie folgt aussehen:@synchronized in einer statischen Methode

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

Aber ich bin neugierig, was genau self bezieht sich auf, wenn Sie eine statische Methode haben (+ statt -). Ich habe versucht, die Apple-Dokumente durchzusehen, und sie verweisen darauf, dass es in Ordnung ist, aber erkläre es nicht wirklich. Ich weiß, es funktioniert, ich bin nur neugierig, was es bedeutet.

Antwort

26

self innerhalb einer Klasse (statische) -Methode bezieht sich auf das Klassenobjekt.

+0

Vielen Dank. Ich weiß, dass es etwas einfaches gab, was ich vermisste. – Itay

+4

Beachten Sie, dass @synchronized (self) in einer Klassenmethode gefährlich sein kann, da für self ein anderes Objekt (Klasse) existiert, so dass immer noch gleichzeitig Zugriff auf die Methode zwischen diesen beiden Klassen bestehen kann –

13

In Objective-C self wird durch Kontext bestimmt. In einer Instanzmethode wäre dies die Instanz, die aufgerufen wird. In einer statischen Methode wäre es das Klassenobjekt selbst (dh das Ergebnis von [self class] in einer Instanzmethode)

0

Mit den obigen Antworten, bedenken Sie, dass, wenn ein Thread eine Instanzmethode mit @synchronized (self) aufruft und ein anderer Thread ruft eine Klassenmethode auf, die @synchronized (self) verwendet. Zwischen den beiden Aufrufen wird keine Synchronisation stattfinden, da sie unterschiedliche Objekte für die Synchronisation verwenden.

Verwandte Themen