iOS单例写成宏定义(ARC和MRC)

使用方法:在pch中引入头文件,单例一般是工具类. 工具类的.h中写 "SINGLEH(className)"  工具类的.m文件中写SINGLEM(className)

宏定义如下


#define SINGLEH(className) + (instancetype)share##className;


#if __has_feature(objc_arc)

#define SINGLEM(className) \

    static id _instance;\

    + (instancetype)allocWithZone:(struct _NSZone *)zone{\

    if (_instance == nil) {\

        @synchronized(self) {\

            if (_instance == nil) {\

        _instance = [super allocWithZone:zone];\

        }\

    }\

}\

    return _instance;\

}\

+ (instancetype)share##className{\

        if (_instance == nil) {\

            @synchronized(self) {\

                if (_instance == nil) {\

            _instance = [[self alloc] init];\

            }\

        }\

    }\

        return _instance;\

        }

#else

#define SINGLEM(className) \

static id _instance;\

+ (instancetype)allocWithZone:(struct _NSZone *)zone{\

    if (_instance == nil) {\

        @synchronized(self) {\

            if (_instance == nil) {\

        _instance = [super allocWithZone:zone];\

    }\

        }\

            }\

            return _instance;\

        }\

+ (instancetype)share##className{\

    if (_instance == nil) {\

        @synchronized(self) {\

            if (_instance == nil) {\

        _instance = [[self alloc] init];\

            }\

        }\

    }\

        return _instance;\

    }\

- (oneway void)release{}\

- (instancetype)retain{return _instance;}\

- (NSUInteger)retainCount{return 1;}\

- (instancetype)autorelease{return _instance;}

#endif

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顾名思义,单例模式的特点就是保证一个类仅有一个实例。因为这个模式只和一个类有关,没有类与类之间的关系,所有就不给出图示了。那么还是先说一下基本的定义。 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。平时,我们常用单例模式的地方通常是多线程。 因为Objective C传承了Smalltalk语言,所以在Objective C中实现单例模式和C++和C#以及Java都不太一样。因为要保证类型对象的单一性,所以就要考虑Objective C在实例化对象时候的各种方式。因为在Objective C中创建的各个类型都继承自NSObject类型,所以我们需要考虑NSObject类型里实例化的方法,下面让我们展开来说。 在Objective C的实例化对象的方式主要有三种,分别如下: obj = [NSObject new]; obj = [[NSObject alloc]init]; obj = [[NSObject allocWithZone]init]; NSObject类参考文档里记录第三种方法是因为历史原因遗留下来的,在当前的Objective C中已经不再使用,所以我们就不考虑这种方式了。下面让我们主要看一下前两种方式。 第一种方式,用new方法初始化其实是第二种方式的总和,当调用new方法时,其实是先调用了alloc方法进行isa(is a pointer)操作,创建指针,指向内存中的数据结构,紧接着调用了init方法对数据进行初始化,NSObject类参考文档里也有具体的说明,大家也可以查看文档,具体实现方式随后我会用代码向大家进行展示。 第二种方式看起来就很明确了,先调用alloc创建指针指向内存中的数据结构,再调用init方法初始化数据。这里需要注意的是,init方法只是起到了初始化数据的作用,其实也可以自定义初始化方法,即完全可以自定义一个普通返回NSObject类型的方法来代替init方法,即init方法是可以随意被代替的。只不过NSObject类型中new方法默认会调用init方法而已,init方法可以看作是NSObject类型的默认构造函数。 所以综上所述,其实只有alloc方法是每次必须调用的方法,那么我们只要控制住alloc方法,对此方法进行覆盖就可以保证类型对象的单一性了。好了,说了这么多,让我们看看如何实现吧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值