標籤:設計模式 單例設計模式
單例設計模式詳解
- 單例設計模式詳解
- 基本概念
- 在IOS中使用單例模式的情況
- 非ARC環境建立單例模式的基本步驟
- 非ARC環境具體代碼實現
- ARC環境建立單例模式的基本步驟
基本概念
單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體而且該執行個體易於外界訪問
在IOS中使用單例模式的情況
1.如果說建立一個對象會耗費很多系統資源,那麼此時採用單例模式,因為只需要一個執行個體,會節省alloc的時間
2.在IOS開發中,如果很多模組都要使用同一個變數,此時如果把該變數放入單例類,則所有訪問該變數的調用變得很容易,否則,只能通過一個模組傳遞給另外一個模組,這樣增加了風險和複雜度
非ARC環境建立單例模式的基本步驟
1.聲明一個單例對象的靜態執行個體,並初始化為nil
2.聲明一個類的Factory 方法,產生一個該類的執行個體,並且只會產生一個
3.覆蓋allcoWithZone方法,確保使用者在alloc 時,不會產生一個多餘的對象
4.實現NSCopying協議,覆蓋release,autorelease,retain,retainCount方法,以確保只有一個執行個體化對象
5.在多線程的環境中,注意使用@synchronized關鍵字
非ARC環境具體代碼實現
#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;{ if(singleInstance==nil){ singleInstance=[super allocWithZone:zone];} return singleInstance;}-(id)copyWithZone:(NSZone *)zone{ 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;}
ARC環境建立單例模式的基本步驟
+ (instantClass *)sharedClient {static instantClass *_sharedClient = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_sharedClient = [[instantClass alloc] init];});return _sharedClient;}
該方法有很多優勢:
1 安全執行緒
2 很好滿足靜態分析器要求
3 和自動引用計數(ARC)相容
4 僅需要少量代碼
iOS常用設計模式——單例設計模式