美文网首页超棒文集
来写一个单例吧---iOS

来写一个单例吧---iOS

作者: StrongX | 来源:发表于2016-03-25 18:41 被阅读1309次

单例指的是在整个工程当中这个类只有一个实例,当你希望整个工程当中这个类只存在一个对象的时候,你就可以来使用单例模式,今天就来讨论一下如何实现一个单例。

单例其实很常见

你一定是用过单例的,因为我们每个工程的入口AppDelegate就是一个单例,任何写到单例里头的实例都是一个单例,所以我们可以借助AppDelegate来实现一个单例。
我们来创建一个类来实现单例,他有一个属性叫做“name”;

我们在AppDelegate.h中引入他的头文件,并给AppDelegate添加一个属性:

@property (nonatomic, strong) singleObject *single;

并在AppDelegate.m中实现他:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    _single = [[singleObject alloc]init];
    _single.name = @"I am singleMode";

    return YES;
}

好的这样我们不管从工程的任何位置,通过AppDelegate来获取到这个single属性,他都是一个单例,因为他在AppDelegate中一个实例,比如我们在Controller中获取到他:

  AppDelegate *appdelegate = (AppDelegate *)([UIApplication sharedApplication].delegate);
    NSLog(@"%@",[NSString stringWithFormat:@"%@",appdelegate.single.name]);
    appdelegate.single.name = @"I can change everyWhere";
    NSLog(@"%@",[NSString stringWithFormat:@"%@",appdelegate.single.name]);
这样的确是实现了一个单例,但是不管怎么看他都不够优雅,所以我们还有显得更加优雅的方式来实现一个单例。

使用GCD的宏 dispatch_once

这个宏可以保证代码块中的代码只执行一次,同时是线程安全的,那么用来创建单例实在是再合适不过了,我们知道类的init方法其实都会调用底层的

+(id)allocWithZone:(struct _NSZone *)zone;

所以我们可以重载此方法保证初始化方法返回的是同一个对象。
我们首先创建一个静态全局对象

static id _instance = nil;

其实这个对象就相当于上面我们在AppDelegate中实例化的那个对象。
我们重载allocWithZone方法:

+(id)allocWithZone:(struct _NSZone *)zone{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _instance = [super allocWithZone:zone];

    });

    return _instance;
}

当我们重载这个初始化方法以后我们所有希望使用init新建对象都会返回我们的_instance对象。
我们写一个静态方法来获取这个单例:

+(instancetype)shareSingle{
    return [[self alloc]init];
}

这是写在.m文件中的方法实现,当然我们需要在.h文件中声明这个方法。

好的,现在到了验证时间了,我们到界面上,创建多个singleObject,然后输出他的name,如果每次我们新建的singleObject的name是相同的,那么我们可以认定这是一个单例了:

 singleeObject *single = [singleObject shareSingle];
    single.name = @"I am create by dispath_once";
    NSLog(@"%@",single.name);

    singleObject *singleObject2 = [singleObject shareSingle];
    NSLog(@"%@",singleObject2.name);

我们创建了两个singleObject对象,我们来看一下他的输出:

两次输出是一样的,那么我们可以认定这个单例创建成功了。

代码我上传了,大家瞅一眼吧:http://pan.baidu.com/s/1bpnvNHl

更多文章关注:http://www.StrongX.cn

相关文章

  • 来写一个单例吧---iOS

    单例指的是在整个工程当中这个类只有一个实例,当你希望整个工程当中这个类只存在一个对象的时候,你就可以来使用单例模式...

  • ios~单例模式:

    在iOS OC中,一般我们都是用官方推荐的写法来写单例:GCD方式单例 分析单例 static SharedPer...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • iOS 单例模式

    关于单例模式的详解,看完这几篇,就完全了然了。iOS 单例模式iOS中的单例模式iOS单例的写法

  • iOS开发 单例使用问题

    iOS开发 单例使用问题 iOS开发 单例使用问题

  • iOS开发 单例使用问题

    iOS开发 单例使用问题 iOS开发 单例使用问题

  • iOS单例模式的正确写法

    单例模式很常见,但是,能真正把单利模式写对的却很少。在iOS中,一般我们都是用官方推荐的写法来写单例: URLMa...

  • iOS单例安全写法

    单例模式很常见,但是,能真正把单利模式写对的却很少。在iOS中,一般我们都是用官方推荐的写法来写单例: 这也是我们...

  • iOS 单例模式 or NSUserDefaults

    本文内容:iOS的单例模式NSUserDefaults的使用总结:iOS单例模式 and NSUserDefaul...

  • OC和Swift单例的写法

    一 、OC中单例的写法:1.普通单例的写法 2. 利用多线程来写单例 #pragma mark --- 普通单例写...

网友评论

    本文标题:来写一个单例吧---iOS

    本文链接:https://www.haomeiwen.com/subject/fhkdlttx.html