iOS単例

4258 ワード

iosの一例モード
元の住所:http://www.galloway.me.uk/tutorials/singleton-classes/
本文は博主自身の翻訳です。転載は出典を明記してください。http://blog.csdn.net/iosevanhuang/article/details/13278323
 
「シングルモード」はiOSで一番よく使うデザインの一つです。一例モードは、任意のパラメータを渡す必要がないので、異なるコード間のデータ共有問題を効果的に解決します。
 
背景
単一の例クラスは非常に有用な設計モードを示しているので、非常に重要な概念である。単一の例のアプリケーションは、全体のiPhone SDKにわたって実行されます。例えば、UAppliationクラスにはsharedAppplicationという方法があり、この方法をどこから呼び出しても、現在実行されているアプリケーションに関連したUPplicationの例を返します。
ブロガーは追加しました。一例のタイプは、アプリケーションのライフサイクルの中に一つだけのインスタンスオブジェクトがあり、外部からアクセスしやすいと保証しています。
 
実現する
下記のコードでObjective-Cの一例クラスを実現できます。
 
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
›import
 
@interface MyManager:NSObject{
NSString*someProperty;
)
 
@property NSString*someProperty;
 
+(id)sharedManager
 
@end
 
MyManager.h
 
 
 
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
›import「MyManager.h」
 
@implemention MyManager
 
@synthesize someProperty;
 
萼pragmamamark Singleton Methods
 
+(id)sharedManager{
static MyManager*sharedMyManager=nil;
static dispatch_オースt onceToken
dispatch_once(&onceToken、^{
sharedMyManager=[self alloc]init]

return sharedMyManager;
)
 
-(id)init{
if(self=[super init]){
someProperty=[NSString alloc]init WithString:@「Default Property Value」;
)
return self
)
 
-(void)dealloc{
//この方法は絶対に使わないでください。
)
 
@end
 
MyManager.m
 
 
ここでは静的変数のsharedMyManagerを定義して、一度だけ初期化します。ここではdispatch_を使いました。Oneceはこの変数がGCDに一度だけ初期化されることを保証します。オペレーティングシステムは、スレッドの安全を保証します。
GCDを使わないなら、以下のコードが使えます。
 
 1
 2
 3
 4
 5
 6
 7
 8
+(id)sharedManager{
static MyManager*sharedMyManager=nil;
@synchronized(self){
if(sharedMyManager==nil)
sharedMyManager=[self alloc]init]
)
return sharedMyManager;
)
 
Non-GCD-based-code.m
 
次に、この単例オブジェクトを使用する必要がある場合、このように呼び出してもいいです。
 1
MyManager*sharedManager=[マイManager sharedManager]
 
snippet(u)file_0.m
私はコードの中で多くの単例類を使っています。例えば、CoreLocationやCoreData機能を処理するために単一の例類を作成します。
 
非ARCコード
私はそんなにお勧めしていませんが、ARC以外の環境を使うなら、下記のコードを使うべきです。
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
›import「MyManager.h」
 
static MyManager*sharedMyManager=nil;
 
@implemention MyManager
 
@synthesize someProperty;
 
萼pragmamamark Singleton Methods
+(id)sharedManager{
@synchronized(self){
if(sharedMyManager==nil)
sharedMyManager=[super allocWithZone:NULL]init]
)
return sharedMyManager;
)
+(id)allocWithZone:(NSZone*)zone{
return[[self sharedManager]retain]
)
-(id)copyWithZone:(NSZone*)zone{
return self
)
-(id)retain{
return self
)
-(unsigned)retainCount{
return UNT_MAX;//このオブジェクトは永遠にリリースされてはいけないという意味です。
)
-(オンワイアvoid)release{
//釈放しない
)
-(id)autrelease{
return self
)
-(id)init{
if(self=[super init]){
someProperty=[NSString alloc]init WithString:@「Default Property Value」;
)
return self
)
-(void)dealloc{
//この方法を起動しない
[someProperty release]
[super dealloc]
)
 
@end
 
MyManager-non-ARC.m
ブロガー:ここの一例は全部怠け者式の一例です。単例の対象の取得方法が初めて呼び出された時に単例のオブジェクトを作成します。クラスがロードされている時に単例のオブジェクトを作成することを餓漢式の一例といいます。