单例设计模式
背景: 为什么产生了单例设计模式?
在我们开发的过程当中,有些类功能是一样的,但是我们在使用的时候,我们每次都会先实例化类获的类的对象,然后通过类的对象实现我们想要的功能.
但在,这样做没有什么大不了的,但是既然每次功能都是一样的,为什么又要浪费那么多的内存空间呢?每次创建一个类的对象就会占用部分空间,而且如果我们需要对对象进行一些基本的设计的时候,每次创建一个对象之后都需要对对象进行一些参数的设计,就显得特别的繁琐.
因此考虑到简单跟内存的原因,我们就考虑能否有渐变的方式达到我们想达到的目的呢?
这时候单例设计模式就是我们最佳的选择.
这时我们需要实现的功能就是每次实现类的时候我们都得到同一个对象,这样即节省了内存的开销,有减轻了我们的工作量.
2.如何实现单例呢?
我们的设计思路就是当用户进行实例化类的时候,我们就
重写他的方法,让开发者在不知不觉中就获得了单例对象,或者使用一个新的方法供开发者使用.
在类的设计里面,我们就声明一个类的实例,然后我们控制这个类的实现,这个我们声明的这个对象,当第一次实例化的时候,我们就给这个类进行声明,然后在以后的每次声明当中,我们就把这个类返回出来就OK了.
3.如何在oc中实现单例呢?
在类的.m文件当中声明一个类的实例变量,然后重载alloc
方法,然后控制类的变量只实现一次,就在第一次使用的时候实例化一次,如果再次使用到的时候就直接返回这个变量.
4.oc中的具体实现
- 声明一个类的全局变量
static ClassName *_class = nil;//使用static关键字那么本条语句就执行一次
2.重写alloc方法: 这里我们选择重写allocWithZone方法,那时因为调用了alloc方法,系统会自动调用allocWithZone方法
- allocWithZone:(strut _NSZone *)zone
{
if(_class == nil)
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{ _class = [super alloc withzone:zone] });//使它只被调用一次
}
3.重写init方法
- (id)init
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{ _class = [super] init});//使它只被调用一次
return _class;
}
4.写一个类方法来获取单例
+(instancetype)shareSoundTool
{
return [[self alloc] init];
}
注意:如果是非arc的环境当中我们还需要重新如下方法
//控制被释放,所以什么都不做
- (oneway void)release
{
}
//控制引用计数加一
- (id)retain
{
return self;
}
//控制引用计数始终为一
- (NSUInteger)retainCount
{
return 1;
}
利用宏来处理相同的代码
背景:比如我们现在有十个单例类需要处理,那我们是不是把上面的代码统统的到处拷贝和粘贴呢?而且粘贴后我们还需要修改方法的名字以及变量的名字
1.定义含有参数的宏
# difine Say(content) +(void)say##content;
以后在调用这个宏的时候只要把参数传进去就可以获取我们想要的方法名字了. ##用来拼接
2. 在宏里面拼接字符
同上
3. 在宏中定义跨行代码
宏的定义只能够控制本行的内容,如果跨行了,那就需要在 本行代码的后面添加 / 来表示下一行也是我们宏定义的内容
ARC与MRC的混编
- 我们可以在工程文件中给对应的文件配置ARC和MRC环境
- 在工程中使用的时候,我们可以使用一个宏来控制
#if __has_feature(objc_arc)
NSLog(@"hello ARC");
#else
NSLog(@"hello MRC");
#endif