新建单例类

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];  ///单例不能这么写
 posted on 2015-05-20 19:20  ianhao_cn  阅读(207)  评论(0编辑  收藏  举报