新建单例类
Singleton.h/.m文件
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
+ (Singleton *)shareInstance;
@end
//.m文件
#import "Singleton.h"
static Singleton *s = nil;//声明一个全局的指针
@implementation Singleton
//如何保证这个单例获取的是同一个对象
+ (Singleton *)shareInstance
{
//同步锁 解决多线程的情况时候出现问题,只有先创建一个才会创建另一个
//如果是在多线程里面,刚开始的时候,如果有俩个线程同时第一次调用这个方法,会产生俩个线程创建了俩个对象,为了避免这种情况的发生,我们需要做如下修改:
@synchronized(self){ //添加了一个同步锁,同步锁的作用就是一次只能有一个线程在访问{}内部的内容,如果有多个内容的话,那么其他线程就处于等待状态.
if(s == nil){
s = [[Singleton alloc] init];
// s = [[super allocWithZone:nil] init];
}
}
return s;
}
//下面注释掉的时防止在MRC下 错误使用的时候解决的方法
// 如果这边用了alloc所以写下面的 单例 用类方法创建
//+(instancetype)allocWithZone:(struct _NSZone *)zone
//{
//这样写以后,会出现很严重的问题,递归,上面调用alloc的方法,然后alloc相当于调用allocWithZone方法,此时会出现问题,所以上面的代码修改成了s = [[super allocWithZone:nil] init];
//这个时候,写完之后我们就可以在外界使用alloc,init了,但是也可能会出现sb 看到了alloc 下面根了个release,这个时候需要做的就是重写release.如果外界使用了retain,那么我们就需要重写retain方法,如果外界使用了copy,那么我们就需要重写copy方法.
// return [Singleton shareInstance];
//}
//- (oneway void)release
//{
//
//
//}
//
//-(instancetype)retain
//{
// return s;
//}
//-(id)copy
//{
// return s;
//}
//-(instancetype)autorelease
//{
// return s;
//}
@end
主程序中写 引入单例类
//单例
//单例其实是一种设计模式,
//单例 顾名思义:一个类只有唯一的一个实例
//系统的单例类有UIDevice,UIScreen,NSBundle,NSFileManager,NSUserDefaults等等.
//单例类一般会提供一个类方法,获得这个唯一的实例
/*
//例如:[UIDeviece currentDevice];
[UIScreen mainScreen];
[NSBundle mainBundle];
[NSFileManager defaultManager];
*/
//这个类方法常以default,share,main等单词开头,与便利构造器的命名规范是不同的,
//我们自己在定义单例类的时候,一定要保证外界能获得唯一的实例! 即每次获得同一个对象.
Singleton *p = [Singleton shareInstance];
Singleton *p1 = [Singleton shareInstance];
Singleton *p2 = [Singleton shareInstance];
NSLog(@"\np = %p\np1 = %p\np2 = %p\n",p,p1,p2);
// Singleton *p3 = [[Singleton alloc] init]; ///单例不能这么写
On the road。。。