//
// SoundTools.m
// 02-单例(ARC)
//
// Created by apple on 14-8-24.
// Copyright (c) 2014年apple. All rights reserved.
//
#import"SoundTools.h"
/**
单例小结:
1.创建一个静态的实例对象,在静态区保存唯一的副本
2.创建一个sharedXXX类方法,方便全局统一条用
3.重写allocWithZone方法
如果是面试,写上面三步就够了
4. copyWithZone方法
*/
@implementationSoundTools
staticSoundTools*_instance;
/**是为当前对象分配内存空间,所有方法都会最终调用的方法*/
/**
无论如何实例化,在内存中都最多保留一个副本,对象应该保存在静态区
静态区中的对象,是在整个程序结束后,才会被销毁。
*/
+ (id)allocWithZone:(struct_NSZone*)zone
{
// return nil;
//懒加载,不能保证多线程并发的实例化是唯一的
//加互斥锁,性能非常糟糕。苹果强烈不建议程序员使用!
// @synchronized(self) {
// if (_instance == nil) {
// _instance = [super allocWithZone:zone];
// }
// }
// dispatch_once能够确保块代码中的操作只被执行一次
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
// block中的代码只能被执行一次
_instance= [superallocWithZone:zone];
});
return_instance;
}
+ (instancetype)sharedSoundTools
{
//无论调用多少次类方法,对象只会被初始化一次
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
_instance= [[selfalloc]init];
});
return_instance;
}
- (id)copyWithZone:(NSZone*)zone
{
return_instance;
}
#pragma mark - MRC相关方法
//判断是否支持MRC
#if !__has_feature(objc_arc)
- (onewayvoid)release {}
- (id)retain {return_instance; }
- (id)autorelease {return_instance; }
- (NSUInteger)retainCount {returnUINT_MAX; }
#endif
- (id)init
{
self= [superinit];
if(self) {
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
//对象属性的初始化
self.num=100;
NSLog(@"初始化了- %d",self.num);
});
}
returnself;
}
- (void)playSoundWithName:(NSString*)name
{
NSLog(@"播放声音%@", name);
}
@end