2011-01-23 8 views
0

同期された関数がありますが、そのブロックのインスタンス変数の値を直接変更できないようです。Objective Cの同期ブロックにインスタンス変数を設定する

+(id)allocWithZone:(NSZone *)zone 
{ 
@synchronized(self) { 
    if (sharedInstance == nil) { 
     sharedInstance = [super allocWithZone:zone]; 

     //This is not allowed 
     something = @"hello"; 

     //This is allowed 
     self.something = @"hello world!"; 

     return sharedInstance; 
    } 
} 

return nil; 
} 

なぜこの場合ですか?私は直接アクセスする必要のある変数を持っています(そして、その変数を合成したくありません)。これをどうやって回避するのですか?

+0

「許可されていません」とはどういう意味ですか?そのコードはコンパイルされませんか?実行時のエラーをトリガしますか?クラッシュした場合の具体的な情報を提供できますか? – Tim

+0

@Darrenインスタンスメソッドのようなクラスメソッドを扱っていて、 '-init'が呼び出される前にivarsを設定しようとしているという事実から始めて、間違っています。 –

+0

@Kevinしかしシングルトンオブジェクトの場合、クラスメソッド(+で始まるクラスメソッドはインスタンスメソッド( - )付き)と同じですか? –

答えて

5

これはインスタンスメソッドではないため、インスタンス変数を変更することはできません。実際にはselfという値がクラスそのものです。あなたのコード行self.something = @"hello world!"は動作しません。あなたが本当に欲しいのはsharedInstance.something = @"hello world!"で、somethingが不動産の場合にのみ有効です。 initメソッドでivarsを設定する方が良いでしょう。

ああ、とにかく+allocWithZone:にビジネス設定のivarsがありません。オブジェクトはまだ初期化されていません。

ここでシングルトンを作成しようとしているとします(そのように見えます)。これはObj-Cのシングルトンについてはblog postです。

+0

ありがとう、それは非常に有用です。はい、この場合、sharedInstance.somethingが動作します。私は実際にシングルトンの作成にこのブログ記事をたどっていました:http://www.duckrowing.com/2010/05/21/using-the-singleton-pattern-in-objective-c/好奇心の理由から、それはなぜですかリンクしたブログ記事はシングルトンパターンの使用を強く推奨していませんか? –

+0

シングルトンは問題ありません。問題は、アップルのサンプルコードでは、コンベンションにするのではなく、シングルインスタンスの制約を適用してシングルトンを実装することです。 '+ sharedInstance'メソッドを持つのは問題ありません。 1つのインスタンスのみを強制することは、ほとんど役に立ちません。例えば、 'NSUserDefaults'はシングルトンですが、あなた自身の別個のインスタンスを割り当て/初期化することを妨げるものではありません。 'NSFileManager'と同じことです。これを制限する実際の必要性を持つことは、まれにしかないでしょう。 –

+0

申し訳ありません...私はあなたを持っていると思います。どうもありがとうございました! –

関連する問題