IOS開発における単例モード使用の詳細

2747 ワード

第一、基本概念
単例モードは一般的なソフトウェア設計モードである.そのコア構造には、単一のクラスと呼ばれる特殊なクラスが1つしか含まれていません.システム内の1つのクラスに1つのインスタンスしかなく、外部アクセスが容易であることを、単一のインスタンス・モードで保証できます.
第二に、IOSにおいて一例モードを使用する場合
1.オブジェクトを作成するのに多くのシステムリソースがかかる場合、インスタンスが1つしか必要ないため、allocの時間を節約する単一のモードが使用されます.
2.IOS開発では、多くのモジュールが同じ変数を使用する場合、その変数を単一のクラスに入れると、その変数にアクセスするすべての呼び出しが容易になります.そうしないと、1つのモジュールを介して別のモジュールに渡すしかなく、リスクと複雑さが増加します.
第三に、単例モードを作成する基本手順
1.単一のオブジェクトの静的インスタンスを宣言し、nilに初期化
2.クラスのファクトリメソッドを宣言し、クラスのインスタンスを生成し、1つだけ生成します.
3.allcoWithZoneメソッドを上書きし、alloc時にユーザが余分なオブジェクトを生成しないようにする
4.NSCopyingプロトコルを実装し、release,autorelease,retain,retainCountメソッドを上書きして、インスタンス化されたオブジェクトが1つしかないことを確認する
5.マルチスレッド環境では@synchronizedキーワードの使用に注意
 
//

//  UserContext.h

//  SingleDemo

//

//  Created by andyyang on 9/30/13.

//  Copyright (c) 2013 andyyang. All rights reserved.

//



#import <Foundation/Foundation.h>



@interface UserContext : NSObject

@property (nonatomic,retain) NSString *username;

@property(nonatomic,retain)NSString *email;

+(id)sharedUserDefault;

@end


 
 
 
//

//  UserContext.m

//  SingleDemo

//

//  Created by andyyang on 9/30/13.

//  Copyright (c) 2013 andyyang. All rights reserved.

//



#import "UserContext.h"



static UserContext *singleInstance=nil;

@implementation UserContext



+(id)sharedUserDefault

{

    if(singleInstance==nil)

    {

        @synchronized(self)

        {

            if(singleInstance==nil)

            {

                singleInstance=[[[self class] alloc] init];

                

            }

        }

    }

    return singleInstance;

}



+ (id)allocWithZone:(NSZone *)zone;

{

    NSLog(@"HELLO");

if(singleInstance==nil)

{

    singleInstance=[super allocWithZone:zone];

}

    return singleInstance;

}

-(id)copyWithZone:(NSZone *)zone

{

    NSLog(@"hello");

    return singleInstance;

}

-(id)retain

{

    return singleInstance;

}

- (oneway void)release



{

}

- (id)autorelease

{

    return singleInstance;

}



- (NSUInteger)retainCount

{

    return UINT_MAX;

}@end

 
#import <Foundation/Foundation.h>

#import "UserContext.h"



int main(int argc, const char * argv[])

{



    @autoreleasepool {

        

       UserContext *userContext1=[UserContext sharedUserDefault];

        UserContext *userContext2=[UserContext sharedUserDefault];

        UserContext *userContext3=[[UserContext alloc] init];

        UserContext *userContext4=[userContext1 copy];

        // insert code here...

        NSLog(@"Hello, World!");

        

    }

    return 0;

}


result: