———-android培训、Java培训、iOS培训,期待与您交流———-
一、基本概念
什么是单例模式
单例模式的意图是使类对象成为系统中唯一的实例。提供一个访问点,成为其他类共享数据的中转站。
单例设计模式的要点:
某个类只能有一个实例;
他必须自行创建这个对象;
必须自行向整个系统提供这个实例;
为了保证实例的唯一性,我们必须将
-
- -(id)copyWithZone:(NSZone *)zone
- +(id)allocWithZone:(NSZone *)zone
- -(id)retain
- -(NSUInteger)retainCount
- -(oneway void)release
- -(id)autorelease
的实现方法进行覆盖;
-
这个方法必须是一个静态类;
二、实现单例模式
步骤思路:
- 创建一个包含想要共享的数据的类
- 为这个类添加一个类方法,该方法返回一个该类的静态实例,并且当已经存在这个静态实例时,不重复创建。
- 重写可能导致创建新的实例或释放当前实例的方法
三、代码举例
创建一个SingletenTool类,此例中,使用该单例共享num和name值。
/*******SingletenTool.h文件*******/
#import <Foundation/Foundation.h>
@interface SingletenTool : NSObject
@property (nonatomic,assign)int num;//共享的num值
@property (nonatomic,copy)NSString *name;//共享的name值
+(instancetype)shareInstance;
@end
/*******SingletenTool.m文件********/
#import "SingletenTool.h"
static SingletenTool *share = nil;//存储共享数据的静态实例
@implementationSingletenTool
+(instancetype)shareInstance{
if (share == nil) {
share = [[SingletenTool alloc]init];
return share;//没有创建SingletenTool实例时创建该实例
}
return share;//如果已经创建该实例则直接返回该实例
}
-(id)copyWithZone:(NSZone*)zone{
return self;//调用copy方法时直接返回该实例,避免通过copy创建新的实例
}
+(id)allocWithZone:(NSZone*)zone{
@synchronized(self) {
if (share == nil) {
share = [superallocWithZone:zone];
return share;
}
}
return share;//重写alloc避免通过alloc创建新的实例
}
-(id)retain{
return self;//使得该实例在MRC模式下不能retain,单例在创建时引用计数为1,知道程序结束引用计数归0,被销毁,程序运行期间始终保持引用计数为1
}
-(NSUInteger)retainCount{
return NSUIntegerMax;
}
-(oneway void)release{//不允许单例对象在程序运行期间release,避免被意外销毁
}
-(id)autorelease{
return self;//不允许单例对象加入自动释放池
}
@end
在使用该类共享数据时,只需要调用+(instancetype)shareInstanc方法即可。例如,假设已经有Dog类和Person类,在Dog类中定义run方法设定num和name的值,使用Person输出。
/*******Dog.m文件*******/
#import "Dog.h"
@implementation Dog
-(void)run{
SingletenTool *st = [SingletenTool shareInstance];
st.name = @"abc";
st.num = 100;//将要共享的值存入单例对象中
}
@end
/******Person.m文件********/
#import "Person.h"
@implementation Person
-(void)run{
SingletenTool *st = [SingletenTool shareInstance];
NSLog(@"%d\t%@",st.num,st.name);
}
@end
/******main.m文件*******/
int main(intargc, const char* argv[]) {
@autoreleasepool {
Person *p = [Personnew];
Dog *d = [Dognew];
[d run];
[p run];//->100 abc
}
return 0;
}
SingletenTool就是一个数据中转站,将需要在不同类之间共享的数据存储在SingletenTool中,就可以用方便的进行数据共享,而不需要在共享的类之间频繁的进行数据的传递。