MRC
//
// CZSoundTool.m
// 06-GCD单例(ARC)
//
// Created by LNJ on 14-6-26.
// Copyright (c) 2014年itcast. All rights reserved.
//
#import"CZSoundTool.h"
@implementationCZSoundTool
/**
创建单例的步骤
1.定义一个全局的静态变量,用来记录“第一次”被实例化出来的对象
2.重写allocWithZone方法,此方法是为对象分配内存空间必须会被调用的一个方法!
因此,在此方法中使用"dispatch_once",能够保证在多线程中,_instance也只能被“分配”一次空间
3.定义一个sharedXXX“类”方法,方便其他使用单例的对象调用此单例
在此方法中,同样使用"dispatch_once",保证使用类方法调用的对象,只会被初始化一次!
注释:如果不考虑copy & MRC,以上三个步骤即可!
4.如果要支持copy,则需要
1>遵守NSCopying协议
2>在copyWithZone方法中,直接返回_instance
=========================================
*/
staticCZSoundTool*_instance;
//在实际给对象分配内存空间时,最终都会调用此方法!
+ (id)allocWithZone:(struct_NSZone*)zone
{
//类似的代码
// 1>如果是多条线程同时分配对象,不能保证唯一性,“非线程安全”
// if (!_instance) {
// _instance = [super allocWithZone:zone];
// }
// return _instance;
// 2>要保证线程安全,使用互斥锁,互斥锁的性能非常不好!
// static int token = 0;
// @synchronized(self) {
// if (token == 0) {
// _instance = [super allocWithZone:zone];
// token = 1;
// }
//
// return _instance;
// }
//在此方法中,只要返回唯一的对象就可以了
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
//此处的代码可以保证在多线程中,只会被执行一次!
_instance= [superallocWithZone:zone];
});
return_instance;
}
+ (instancetype)sharedSoundTool
{
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
// 1. MRC修改的第一点,增加autorelease
_instance= [[[CZSoundToolalloc]init]autorelease];
});
return_instance;
}
- (id)copyWithZone:(NSZone*)zone
{
return_instance;
}
#pragma mark - MRC需要重写的方法,目的就是覆盖系统默认的内存管理方法
//默认引用计数加1
- (id)retain
{
//单例中不需要增加引用计数
returnself;
}
//在MRC中,使用过autorelease分配的对象,延迟销毁,出了作用域之后,会被放到自动释放池中
//只有“堆”中的对象,才需要放到自动释放池中!
- (id)autorelease
{
//单例中不需要延迟销毁
returnself;
}
// retainCount表示有多少个对象对当前对象进行强引用,系统底层的框架同样会引用
//实际开发中,跟踪引用技术数值是毫无意义的事情!
- (NSUInteger)retainCount
{
//单例中不需要修改引用计数,返回最大的无符号整数
// return 1;
returnUINT_MAX;
}
- (onewayvoid)release
{
//在单例中,啥也不用做!
}
#pragma mark -对象初始化方法
//单例对象只应该被初始化一次
- (instancetype)init
{
self= [superinit];
if(self) {
}
returnself;
}
#pragma mark -成员方法
- (void)playSoundWithName:(NSString*)name
{
NSLog(@"播放%@", name);
}
@end