1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 [self test]; 6 } 7 8 - (void)test 9 { 10 XZMusicTool *tool = [[XZMusicTool alloc] init]; 11 XZMusicTool *tool2 = [[XZMusicTool alloc] init]; 12 XZMusicTool *tool3 = [XZMusicTool sharedMusicTool]; 13 XZMusicTool *tool4 = [XZMusicTool sharedMusicTool]; 14 15 // copy 有可能会产生新的对象 16 // copy方法内部会调用- copyWithZone: 17 XZMusicTool *tool5 = [tool4 copy]; 18 19 NSLog(@"%@ %@ %@ %@ %@", tool, tool2, tool3, tool4, tool5); 20 }
[[XZMusicTool alloc] init];
[XZMusicTool sharedMusicTool];
[tool4 copy];
以上三种方式都能保证创建出来的对象是同一个.
1 /** 2 * 懒汉式 3 */ 4 #import <Foundation/Foundation.h> 5 6 @interface XZMusicTool : NSObject 7 + (instancetype)sharedMusicTool; 8 @end
1 . 2 // 懒汉式 3 4 #import "XZMusicTool.h" 5 6 @implementation XZMusicTool 7 static id _instance; 8 9 /** 10 * alloc方法内部会调用这个方法 11 */ 12 + (id)allocWithZone:(struct _NSZone *)zone 13 { 14 if (_instance == nil) { // 防止频繁加锁 15 @synchronized(self) { 16 if (_instance == nil) { // 防止创建多次 17 _instance = [super allocWithZone:zone]; 18 } 19 } 20 } 21 return _instance; 22 } 23 24 + (instancetype)sharedMusicTool 25 { 26 if (_instance == nil) { // 防止频繁加锁 27 @synchronized(self) { 28 if (_instance == nil) { // 防止创建多次 29 _instance = [[self alloc] init]; 30 } 31 } 32 } 33 return _instance; 34 } 35 36 - (id)copyWithZone:(NSZone *)zone 37 { 38 return _instance; // 既然可以copy,说明是已经创建了对象。 39 } 40 @end
1 /** 2 * 饿汉式 3 */ 4 #import <Foundation/Foundation.h> 5 6 @interface XZSoundTool : NSObject 7 + (instancetype)sharedSoundTool; 8 @end
1 // 饿汉式 2 3 #import "XZSoundTool.h" 4 5 @implementation XZSoundTool 6 static id _instance; 7 8 /** 9 * 当类加载到OC运行时环境中(内存),就会调用一次(一个类只会加载1次) 10 */ 11 + (void)load 12 { 13 _instance = [[self alloc] init]; 14 } 15 16 + (id)allocWithZone:(struct _NSZone *)zone 17 { 18 if (_instance == nil) { // 防止创建多次 19 _instance = [super allocWithZone:zone]; 20 } 21 return _instance; 22 } 23 24 + (instancetype)sharedSoundTool 25 { 26 return _instance; 27 } 28 29 - (id)copyWithZone:(NSZone *)zone 30 { 31 return _instance; 32 } 33 34 ///** 35 // * 当第一次使用这个类的时候才会调用 36 // */ 37 //+ (void)initialize 38 //{ 39 // NSLog(@"HMSoundTool---initialize"); 40 //} 41 @end