ios中什么是单例
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
在Java中我们定义一个单例类:
[java] view plaincopy?在CODE上查看代码片派生到我的代码片
public class Singleton {
private static Singleton uniqueInstance = null;
private Singleton() {
// Exists only to defeat instantiation.
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// Other methods...
}
在ios中我们按照java那样定义一个单例类,
[objc] view plaincopy?在CODE上查看代码片派生到我的代码片
static DataModel *_sharedDataModel=nil;
@implementation DataModel
+(DataModel *)sharedDataModel
{
if (!_sharedDataModel)
{
_sharedDataModel=[[self alloc] init];
}
return _sharedDataModel;
}
@end
[objc] view plaincopy?在CODE上查看代码片派生到我的代码片
DataModel *model1=[[DataModel alloc] init];
DataModel *model2=[DataModel sharedDataModel];
NSLog(@"model1:%@",model1);
NSLog(@"model2:%@",model2);
打印内存地址,我们发现内存地址不一样,也就是说它们并没有共用一个内存,
[objc] view plaincopy?在CODE上查看代码片派生到我的代码片
2014-02-24 14:31:57.734 IOSStudy[833:a0b] model1:
2014-02-24 14:31:57.735 IOSStudy[833:a0b] model2:
显然在ios中这样定义单例类是不对的,查相关资料,发现
在objective-c中要实现一个单例类,至少需要做以下四个步骤:
1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
4、适当实现allocWitheZone,copyWithZone,release和autorelease。