2009-08-14 7 views
17

Objective-Cでは、@synchronized構造体を使用することで、あるオブジェクトでブロックが同期していると宣言できます。@ staticメソッドで同期されています

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

は、しかし、私はあなたが静的メソッド(代わりに-+)を持っているときに正確selfが参照しているものを興味:それは次のようになります。私はAppleのドキュメントを見てみることを試みました、そして、それはそれがOKであると言っていますが、本当にそれを説明しません。私はそれが動作することを知っている、私はちょうどそれが意味するものが不思議です。

答えて

26

selfクラス(静的)メソッドの内部は、クラスオブジェクトを参照します。

+0

ありがとうございます。シンプルなものがあることは分かっています。 – Itay

+4

サブクラスselfは別のオブジェクト(クラス)なので、クラスメソッドの@synchronized(self)は危険であることに注意してください。 –

13

In Objective-C selfは、コンテキストによって決まります。インスタンスメソッドでは、それが呼び出されるインスタンスになります。静的メソッドでは、それはクラスオブジェクトそのものです(つまり、インスタンスメソッドでは[self class]の結果)

0

上記の答えで、あるスレッドが@synchronized(self)を使用してインスタンスメソッドを呼び出すと、別のスレッドが@synchronized(self)を使ってクラスメソッドを呼び出すと、同期のために異なるオブジェクトを使用しているため、2つの呼び出し間で同期は行われません。

関連する問題