彭序猿

耕读传家,学为好人

你好,我是彭序猿,目前在iOS开发的道路上探索,这里会写点关于iOS开发blog,还有一些生活上的琐碎事儿。


我们做技术的,不会耍什么心眼,从来都是你看我顺眼,我看你顺眼,那我们就是好基友~

iOS单例模式

单例 保证一个对象只实例化一次 全局使用的都是同一个对象

  • 一是某个类只能有一个实例;
  • 二是它必须自行创建这个实例;
  • 三是它必须自行向整个系统提供这个实例。

第一种写法:

 +(instancetype)shareInstance{
static PXYGuidePageHelper *instance;
@synchronized(self) {
if (instance == nil) {
instance = [PXYGuidePageHelper new];
}
}
return instance;
}

第二种写法:

 +(instancetype)shareInstance{
    static dispatch_once_t onceToken;
    static PXYGuidePageHelper *instance;
    dispatch_once(&onceToken, {
        instance = [PXYGuidePageHelper new];
    });
    return instance;
}

首先说下第一种写法: 单例实例是全局使用的,因此要要定义成全局变量 用static修饰 static介绍 @synchronized这个指令是解决多个线程同时执行同一个代码块 ,@synchronized相当于给这个代码块加锁(防止死锁) 这里判断当前对象时候存在,不存在创建,存在则返回该对象。

第二种写法: dispatch_once这个就是保证只执行一次 所以这里确保 该实例只创建一次

两者区别: 第一种在每次执行shareInstance方法是都会加一次锁,然后在代码块里面判断 if (instance == nil) 这个来决定是否实例化,这里每次都会有开销。

“实际上,如果你去看这个函数所在的头文件,你会发现目前它的实现其实是一个宏,进行了内联的初始化测试,这意味着通常情况下,你不用付出函数调用的负载代价,并且会有更少的同步控制负载。”

这样子分析的GCD创建单例更加优雅点。

----
第一种相当于是 懒汉式单例类 双检锁写法

对于第一种的每次都要加锁的写法,可以使用双检锁写法来提高效率。

+(instancetype)shareInstance{
    static PXYGuidePageHelper *instance;
    if (instance == nil) {
        @synchronized(self) {
            if (instance == nil) {
                instance = [PXYGuidePageHelper new];
            }
        }
    }
    return instance;
}

这样子就能保证只有在第一次进行加锁开销。

还有一种 饿汉式单例 是在程序一启动就实例化 +(void)load函数里面实现,然后在allocWithZone进行加锁判空操作,这样子无论你是否用特定的方法获取实例,都会返回同一个对象。

以上

最近的文章

Effective Objective-C 2.0 总结(一)

前言阅读书籍全名Effective Objective-C 2.0 编写高质量iOS与OS X 代码的52个有效方法最经买了本编写高质量代码 改善Objective-C程序的61个建议,拿到手看了下目录感觉内容比这本52个有效方法更深点,之前只是浅度这本,具体讲什么也不是很记得了,所以打算先重新看下这本52个有效方法,然后再来拜读新入手的这本。这里准备记录下Effective Objective-C 2.0 编写高质量iOS与OS X 代码的52个有效方法这本提到的知识点。第一章 熟悉Ob...…

继续阅读
更早的文章

关于团队开发的编码规范

以下是均是个人看法,不喜勿喷,欢迎大家一起多多交流,共同进步。对于编码,每个人都有自己的习惯 ,但是我觉得要开发出优质代码的话有些规范还是要统一,毕竟你不是一个人做开发,你要考虑到团队协作以及后续人员维护你的项目,你想一下,让你维护一个别人的项目,上来就是ViewController几千行,所有页面逻辑全部在控制器里面,各种不能见名思义的变量属性,瞬间有种想死的感觉有木有😂😂😂所以吧,还是不要任性开发。说是对于团队开发的编码规范,其实在个人独立开发的时候也需要注意编码的问题,网上面有很多大...…

继续阅读