[iOS] Objective-C的单件模式

本文详细解析了单件模式的实现方法及其潜在问题,并提供了优化建议,包括如何避免对象被多次初始化,确保多线程环境下的安全性,以及在关键方法中进行异常监控。同时,文章还分享了单件模式的实例代码,帮助开发者理解和实践。

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

首先,苹果官方文档给出了单件模式的例子,代码见本文最后。
其方式是重写release,retain,retainCount,autoRelease,allocWithZone和copyWithZone等方法。

1 重写allocWithZone和copyWithZone的目的是外部在多次调用alloc的时候,内部能够确保对象只创建了一次。
2 重写release、retain、autorelease、retainCount避免单件对象被外部释放。(官方文档的旧版本没有重写这些方法导致对象有可能被Over-Release,即多次release,导致崩溃)

 两个缺点:
A 隐藏了在对象生命周期管理时出现的bug。
    对对象的引用出错的原因必然是程序本身的错误,隐藏对象的引用计数错误就是隐藏了应用程序的错误。
    从工程角度上讲,崩溃要比程序的逻辑错误容易定位。
    解决方法:建议在release、retain、autorelease里面做一些内部的调用次数监控,一旦发现外部调用不平衡就发出警告。
B 对象可以被多次init。
    多次调用init导致错误的可能性还是有的,这种错误包括重复加载某些资源降低性能。
    解决方法:重写init并在内部判重就可以了。
C 多线程安全
    解决方法:在sharedManager中加入同步代码块,代码:
+ (MyGizmoClass*)sharedManager
{
    @synchronized(self) {
		if (sharedGizmoManager == nil) {
			sharedGizmoManager = [[super allocWithZone:NULL] init];
		}
    }
    return sharedGizmoManager;
}
附官方单件模式的代码
static MyGizmoClass *sharedGizmoManager = nil;

+ (MyGizmoClass*)sharedManager
{
    if (sharedGizmoManager == nil) {
        sharedGizmoManager = [[super allocWithZone:NULL] init];
    }
    return sharedGizmoManager;
}

+ (id)allocWithZone:(NSZone *)zone
{
    return [[self sharedManager] retain];
}

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

- (id)retain
{
    return self;
}

- (NSUInteger)retainCount
{
    return NSUIntegerMax;  //denotes an object that cannot be released
}

- (void)release
{
    //do nothing
}

- (id)autorelease
{
    return self;
}







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值