標籤:
單例模式是iOS設計模式中常用的一種設計模式,它的意圖是保證一個類僅有一個執行個體,並提供一個訪問它的全域訪問點。單例模式的作用就是為瞭解決“應用中只有一個執行個體”這一類問題。
單例模式一般會封裝一個靜態屬性,並提供靜態執行個體的建立方法。下面上代碼:
//// Singleton.h// DesignPatternsDemo//// Created by 韓學鵬 on 15/6/19.// Copyright (c) 2015年 韓學鵬. All rights reserved.//#import @interface Singleton : NSObject+ (Singleton *)shareManager;@end
//// Singleton.m// DesignPatternsDemo//// Created by 韓學鵬 on 15/6/19.// Copyright (c) 2015年 韓學鵬. All rights reserved.//#import "Singleton.h"@implementation Singletonstatic Singleton *_shareManager = nil;+ (Singleton *)shareManager { static dispatch_once_t once; dispatch_once(&once, ^{ _shareManager = [[self alloc] init]; }); return _shareManager;}@end
如果使用者能嚴格按照要求來使用給定的方法,這個單例還是可以的,但是,如果不小心調用了其他可以產生對象的方法,那這個單例就失去了它的作用。所以,這個單例還需要改造:
1、重寫allocWithZone方法,保證使用者在調用alloc或者init的時候不會產生新的對象。
2、重寫copyWithZone和mutableCopyWithZone方法,保證使用者在進行對象複製的時候不會產生新的對象。
3、看情況重寫retain、retainCount、release和autorelease方法。(ARC模式下需要注釋掉)
重新改造的單例如下:
//// Singleton.m// DesignPatternsDemo//// Created by 韓學鵬 on 15/6/19.// Copyright (c) 2015年 韓學鵬. All rights reserved.//#import "Singleton.h"@implementation Singletonstatic Singleton *_shareManager = nil;+ (Singleton *)shareManager { static dispatch_once_t once; dispatch_once(&once, ^{ _shareManager = [[self alloc] init]; }); return _shareManager;}+ (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t once; dispatch_once(&once, ^{ _shareManager = [super allocWithZone:zone]; }); return _shareManager;}- (id)copyWithZone:(NSZone *)zone { return _shareManager;}- (id)mutableCopyWithZone:(NSZone *)zone { return [self copyWithZone:zone];}/* ARC無效時- (id)retain { return _shareManager;}- (NSUInteger)retainCount { return 1;}- (oneway void)release { }- (id)autorelease { return _shareManager;}*/@end
測試代碼和輸入輸出結果:
id obj = [Singleton new]; id obj1 = [Singleton shareManager]; id obj2 = [[Singleton alloc] init]; NSLog(@"obj:%@", obj); NSLog(@"obj1:%@", obj1); NSLog(@"obj2:%@", obj2);
輸出:
2015-06-19 19:15:27.452 DesignPatternsDemo[24125:607] obj:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj1:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj2:
附上這個類的:單例
iOS常用設計模式之單例模式