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;
}