iOS設計模式之單例,iOS設計模式之
單例模式的意思就是這個類只有一個執行個體,這個類就是單例類。在iOS中有不少都是單例NSNull,NSFileManager ,UIApplication,NSUserDefaults ,UIDevice,還有一些第三方也有能用到了這種設計模式例如Afhttpmanger。。。
(1)單例模式的作用 :可以保證在程式運行過程,一個類只有一個執行個體,而且該執行個體易於供外界訪問,從而方便地控制了執行個體個數,並節約系統資源。
(2)單例模式的使用場合:在整個應用程式中,共用一份資源(這份資源只需要建立初始化1次),應該讓這個類建立出來的對象永遠只有一個。
實現思路:
//// AudioPlayer.m// 單例//// Created by 兩好三壞 on 16/2/21.// Copyright © 2016年 ;. All rights reserved.//#import "AudioPlayer.h"@interface AudioPlayer ()<NSCopying>@end@implementation AudioPlayer//建立一個一個全域的static的執行個體 static id _instance;static id _instance;//提供1個類方法讓外界訪問唯一的執行個體+(instancetype)shareAudioPlayer{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance;}//重寫allocWithzone:方法,控制記憶體配置。因為alloc內部會調用該方法,每次調用allocWithzone:方法,系統都會建立一塊新的記憶體空間。+(instancetype)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); return _instance;}//實現copyWithZone:方法-(id)copyWithZone:(NSZone *)zone{ return _instance;}@end
在控制其中建立單例類的對象,列印地址:
- (void)viewDidLoad { [super viewDidLoad]; AudioPlayer *player1 = [AudioPlayer shareAudioPlayer]; AudioPlayer *player2 = [[AudioPlayer alloc] init]; AudioPlayer *player3 = [AudioPlayer new]; AudioPlayer *player4 = [player1 copy]; NSLog(@"%p,%p,%p,%p",player1,player2,player3,player4); }//列印結果2016-02-21 23:27:13.990 單例[2847:329685] 0x7fb6e3e080a0,0x7fb6e3e080a0,0x7fb6e3e080a0,0x7fb6e3e080a0
四個執行個體的記憶體位址是一樣的,證明只建立了一個執行個體;
MRC環境下通常需要在實現下面幾個方法:
- (oneway void)release {}- (id)retain { return _instance; }- (id)autorelease { return _instance; }- (NSUInteger)retainCount { return UINT_MAX; }
可以使用宏判斷是否為mrc,
#if __has_feature(objc_arc) // ARC #else // MRC #endif
當然還可以把單例也抽取成為宏,用起來還挺方便的;你們也可以試試試~~~