iOS单例模式简单实现

1. 单例模式介绍

内存中只有一个对象实例

2. 实现思路

实现单例模式
ARC模式:
1.遵循协议,重写copyWithZone方法,返回self,防止通过copy来产生新的实例对象。
2.重写allocWithZone方法。代码如下。防止通过alloc来生成新的实例对象。
MRC模式:
1.同ARC模式
2.- (void)retain{
//retain不用写,因为返回的retainCount是最大的无符号整数。
}
- (NSUInteger)retainCount{
return NSUIntegerMax;
}
- (oneway void)release{
- //release不写,这样子是的不能通过代码来释放单利对象。
}
- (id)autoreleae{
return self; // 返回自身。
}

3. 示例代码

SingletonTool.h

@interface SingletonTool : NSObject<NSCopying>

@property (nonatomic,assign) int number;
@property (nonatomic,copy) NSString *name;
+ (instancetype)shareInstances;
@end

SingletonTool.m

SingletonTool *instance = nil;

@implementation SingletonTool
+ (instancetype)shareInstances{
    if (instance == nil) {
        instance = [[SingletonTool alloc]init];
        return instance;
    }
    return instance;
}

- (id)copyWithZone:(NSZone *)zone{
    return self;
}
+ (id)allocWithZone:(struct _NSZone *)zone{
    @synchronized(self) {
        if (instance == nil) {
            instance = [super allocWithZone:zone];
            return instance;
        }
    }
    return instance;
}
- (void)retain{

}
- (NSUInteger)retainCount{
    return NSUIntegerMax;
}
- (oneway void)release{

}
- (id)autoreleae{
    return self;
}

@end

main.m

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        SingletonTool *st = [SingletonTool shareInstances];
//        Person *p = [Person new];
//        [p run];
//        Dog *d = [Dog new];
//        [d run];

        //下面的代码可以在ARC和MRC模式下来验证单例模式。
        st.name = @"abc";
        st.number = 213;
        SingletonTool *st2 = [[SingletonTool alloc]init];
        SingletonTool *st3 = [st2 copy];

        NSLog(@"%lu %lu %lu",st.retainCount,st2.retainCount,st3.retainCount);

        NSLog(@"%@ %d",st3.name,st3.number);

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值