一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

苹果iOS检测类是否是单例类

时间:2016-06-06 编辑:简简单单 来源:一聚教程网

一般我们都是自己封装个类方法来获取单例类的类对象,但是某些类也是用很相似的方法声明来获取类对象的:
比如著名网络请求第三方库AFNetworking里的AFHTTPSessionManager类,获取类对象的方法是:

 代码如下 复制代码
/**
Creates and returns an `AFHTTPSessionManager` object.
*/
+ (instancetype)manager;

但是这个通过这个方法获取到的对象却不是单利对象,检测方法如下:

 

 代码如下 复制代码
-(void)testAFHTTPSessionManagerIsSingletonClass
{
    NSLog(@"%@",[AFHTTPSessionManager manager]);
    NSLog(@"%@",[AFHTTPSessionManager manager]);
}
控制台打印的信息:
2016-06-05 18:17:31.074 TestApp[2923:50226]
2016-06-05 18:17:31.075 TestApp[2923:50226]

对比两个对象的内存地址可知[AFHTTPSessionManager manager]获取到的对象不是单例对象!

下面是我自己封装的单例类:

 代码如下 复制代码

-(void)testSingleClassIsSingletonClass
{
    NSLog(@"%@",[SingleClass sharedSingleClass]);
    NSLog(@"%@",[SingleClass sharedSingleClass]);
}
控制台打印的信息:
2016-06-05 18:39:58.790 TestApp[3664:63737]
2016-06-05 18:39:58.791 TestApp[3664:63737]

//好吧,我确实把这两个对象的内存地址复制上去了,可为什么就是不显示,我却不知道了。我只想说这两个对象的内存地址是一样的!

附上sharedSingleClass的方法实现:

 

 代码如下 复制代码
+ (id)sharedSingleClass{
    //1:声明一个静态的全局的单例对象指针,初始值为nil
    static SingleClass *single = nil;
    
    //2:调用GCD的once方法//能够保证block中代码块在整个程序运行过程中只会被执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{//block代码段,代码块
        //3:实例化single对象指针
        single = [[SingleClass alloc] init];
    });
    
    //NSLog(@"single = %p", single);
    
    return single;//4:返回已经初始化的single指针
}

热门栏目