iOS 面试中单例模式的设计

本文介绍单例模式的应用场景及设计方法,包括全局实例创建、工厂方法实现、重写allocWithZone及copyWithZone等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看过很多大公司的面试,常被要求设计一个单例,所以查了一些网上文档和一些书籍,现在整理一下分享给大家:
在以下情况下,应该考虑使用单例模式:
1.类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如说工厂方法
2.这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码

如何设计一个单例模式的类

1.首先必须创建一个全局实例,通常存放在一个全局变量中,此全局变量设置为nil  (Singleton是建的的单例类)
static Singleton *shareSingleton = nil;
2.提供工厂方法对该全局实例进行访问,检查该变量是否为nil,如果为nil就创建一个新的实例,最后返回全局实例
+ (Singleton *) shardInstance
{
    if (shardSingleton == nil) {
        shardSingleton = [[super allocWithZone:NULL] init];
    }
    return shardSingleton;
}

3.全局变量的初始化在第一次调用工厂方法时会在:+allocWithZone中进行,所以需要重写该方法,防止通过标准的alloc方法来创建新的实例

+ (id)allocWithZone:(struct _NSZone *)zone
{
    return [[self shardInstance] retain];
}

4.为了防止通过copy方法得到新的实例,需要重写copyWithZone方法

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

只需在此方法中返回本身即可,引用计数也不需要改变,因为单例设计模式下的对象是不允许销毁的,所以也就不用保留

5.因为全局实例是不允许释放的,所以retain,release,autorelease方法均需重写

- (id) retain
{
    return self;
}
- (id) release
{
    //什么也不做
}
- (NSInteger) retainCount
{
    return NSUIntegerMax;
}
- (id) autorelease
{
    return self;
}

这样整个单例模式就设计完啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值