更新:
:今日このアドバイスを与えた場合、私は共有インスタンスを使用すると言うでしょう
@interface SomeClass: NSObject
{
+(SomeClass *)shared;
}
@implementation SomeClass
{
+(SomeClass *)shared {
static SomeClass *shared;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [SomeClass new];
});
return shared;
}
}
それからそれはあなたのアプリケーション全体で最初の使用時にあなたのための自動インスタンス化され、かつ利用可能:
[[SomeClass shared] doSomething];
シングルトン - オブジェクトのグローバル共有インスタンスです。あなたが別のソースファイルで、あなたのオブジェクトにアクセスする必要があるときは、他の参照の場合と同様に
@interface SomeClassSingleton : NSObject {
}
+(SomeClass*)sharedSomeClass;
+(void)setSharedSomeClass:(SomeClass*)someObject;
@end
@implementation SomeClassSingleton
static SomeClass* _someObject = nil;
+(SomeClass*)sharedSomeClass
{
return _someObject;
}
+(void)setSharedSomeClass:(SomeClass*)someObject
{
@syncrhonized(self)
{
_someObject = someObject;
}
}
@end
はその後、あなたは、他のヘッダであなたのシングルトンのためのヘッダファイルをインポートします。
シングルトンを作成します。
SomeClass* someObject = [[SomeClass alloc] init];
[SomeClassSingleton setSharedSomeClass:someObject]; // write to save your singleton
使用/シングルトン読み:
[[SomeClass sharedSomeClass] someSharedClassMessage];
// OR
SomeClass* someObject = [SomeClass sharedSomeClass];
それとも、あなたはあなたがそれを初めてアクセスINITS自動シングルトンの実装を作成することができます
を
@implementation SomeClassSingleton
static SomeClass* _someObject = nil;
+(SomeClass*)sharedSomeClass
{
@synchronized(self) {
if (_someObject == nil) {
_someObject = [[SomeClass alloc] init];
}
}
return _someObject;
}
@end
お返事ありがとうございました。なぜ同期? –
'@ syncrhonized'はスレッドセーフです。 iOSのようなマルチスレッド環境では、共有オブジェクトが一度に複数のスレッドによって変更されないようにする必要があります。静的オブジェクト、またはここで実装されているようなシングルトンは、1つのコピーとしてメモリに存在します。 '@synchronized'は渡したオブジェクトをロックし、スレッド間でのアクセスを「同期」するので、ロック中にアクセスしようとするスレッドは、ロックが開かれるまで待たなければなりません。これは、ロックが設定されている間、第2のスレッドが継続するのをブロックする、基本的な「ブロック」メカニズムです。 – nekno
ありがとうございました! –