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キーワードの使用に注意
result:
単例モードは一般的なソフトウェア設計モードである.そのコア構造には、単一のクラスと呼ばれる特殊なクラスが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: