iOS--单例模式
来源:互联网 发布:不给转出域名怎么处理 编辑:程序博客网 时间:2024/05/17 10:08
单例模式是iOS设计模式中常用到的设计模式之一,在此小懒仅通过作为初学者的自己的想法写点东西,应该对初学者会有帮助,大神请指教。
不废话,先来段代码:
新建Singleton类
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
+(Singleton *)singleton;
@end
/////////////////////////////////////////////////////////////////////////////////
#import "Singleton.h"
static Singleton *share = nil;
@implementation Singleton
+(Singleton *)singleton
{
@synchronized(self) {
if(share == nil) {
[[[self class] alloc] init];
}
}
return share;
}
@end
OK,到此以前的我觉得已经写完一个单例类了,很多初学者也只是写到这一步,确实仅凭这些代码可以完成单例的实现,但是在实际运用过程中他是有缺陷的。比如在团队合作过程中,另一个程序猿并不知道这个类是单例类,用alloc init来实现一个对象,那么这个对象就是这个类的普通对象,所以说到这里你应该知道问题所在了 吧。
解决上述问题其实也简单,只需要重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例。
先添加以下方法:
+ (instancetype) allocWithZone:(struct _NSZone *)zone
{
return [self singleton];
}
- (instancetype) copyWithZone:(NSZone*)zone
{
return self;
}
- (id) retain
{
return [Singleton singleton];
}
最后修改singleton方法:
+ (Singleton *) singleton
{
@synchronized(self)
{
if (!share) {
share = [[super allocWithZone:NULL] init];
}
}
return share;
}
OK,这样就可以确保确实创建的是单例了。
细心的初学者朋友可能会对这句话有问题:@synchronized(self),@synchronized 的作用是创建一个互斥锁,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。
最后再给出一个高大上的方法(GCD实现单例),这算是比较高阶的写法了,只需要对singleton方法进行如下修改:
+ (Singleton*) singleton
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
share = [[super allocWithZone:NULL] init];
});
return share;
}
OK,到此是我对单例模式的理解,希望会对你有用。
0 0
- iOS单例模式
- iOS 单例模式
- IOS 单例模式
- iOS 单例模式
- IOS单例模式
- ios单例模式
- iOS 单例模式
- iOS 单例模式
- IOS单例模式
- iOS 单例模式
- iOS 单例模式
- IOS 单例模式
- IOS---单例模式
- iOS--单例模式
- iOS 单例模式
- ios 单例模式
- iOS 单例模式
- IOS单例模式
- 复选框单选框与文字对齐问题的研究与解决
- cocos2d-x帧动画 -- 角色跑动
- CSDN在线培训:大数据环境下的关联规则挖掘
- Android的优点和不足之处
- SPDY、HTTP/2、QUIC协议
- iOS--单例模式
- MyEclipse 无法非法关闭,导致无法启动,一直停留在Loading workbench启动页面
- 关于C++ const 的全面总结
- System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
- java URL协议处理
- CodeIgniter系列 添加filter和helper
- Java:String和Date、Timestamp之间的转换
- 现在却好像是个历经沧桑的老人一样
- 不同局域网内经Internet的P2P通信技术总结不同局域网内经Internet的P2P通信技术总结