iOS 之路iOS2iOS 开发

iOS单例模式的实现

2016-02-28  本文已影响154人  qiongyong

转自于宏创学院:单例singleton模式–单例类的实现 – 宏创学院


以前写的单例类只是提供了一个 类方法让外界使用 并没有将alloc方法考虑进去,因为一般调用单例的方法 都是类方法 但是万一还是有人在多个地方获取单例对象的时候还是使用alloc怎么办呢?看了上面的教程才知道还有这种写法

其实,单例类的写法有很多种

这里先提供一般常用的三种单例类的写法:

如:我写一个UserInfo的单例类

1.使用GCD dispatch_once 整个程序运行间只执行一次

2.加线程锁 NSLock

3:使用@synchronized

但是上面的写法都是没有将外界会再次使用alloc的,而不是直接使用shareInstance类方法的情况考虑进去的,测试使用这个类方法创建 和 使用 alloc 创建的地址不是一样的,所以最好要防止这种情况出现


#import

//这里遵守NSCopying 是因为将copy考虑了进去 自定义的类要使用copy必须遵守这个,开发中不考虑这个的可以不遵守的

@interface Singleton:NSObject <NSCopying>

/**

*  获取单例类

*

*  @return 单例类对象

*/

+(instancetype)sharedInstance;

@en

#import "Singleton.h"

@implementationSingleton

staticid _instance;

+(instancetype)sharedInstance

{

staticdispatch_once_tonceToken;

dispatch_once(&onceToken,^{

_instance=[[selfalloc]init];

});

return_instance;

}

//实现这个方法以后 无论外界alloc多少次 不同的对象,它们的地址都是一样的

+(id)allocWithZone:(struct_NSZone*)zone

{

staticdispatch_once_tonceToken;

dispatch_once(&onceToken,^{

_instance=[superallocWithZone:zone];

});

return_instance;

}

//这个方法只有在遵守了NSCopying才会起作用 保证了 外界使用copy这个类的对象的时候,地址还是一样的

-(id)copyWithZone:(NSZone*)zone

{

return_instance;

}

@end


这样写的话无论调用alloc 还是我们提供的类方法创建出来的对象都是头一个对象

还有需要注意的是:一个父类是单例类,那么它的子类也是单例类 ,并且它的地址跟父类是一样的

上一篇 下一篇

猜你喜欢

热点阅读