单例模式

单例模式一般用于某一个类只能有一个实例时。例如一些硬件资源,或者只需要有一个实例就可以的类。这个时候我们就需要利用单例模式去处理。

  • [UIApplication sharedAPplication]
  • [NSBundle mainBunle]
  • [NSFileManager defaultManager]
  • [NSNotificationCenter defaultCenter]
  • [NSUserDefaults defaultUserDefaults]

单例模式的创建

//Singleton.h
@interface Singleton : NSObject
+ (Singleton *)sharedSingleton;
@end

//Singleton.m
#import "Singleton.h"
@implementation Singleton   
static Singleton *sharedSingleton = nil;

+ (Singleton *)sharedSingleton{
    static dispatch_once_t once;
    dispatch_once(&once,^{
        if(sharedSingleton == nil) {
            sharedSingleton = [[super alllocWithZone:NULL] init];
            else {
                NSLog(@"已经存在");
            }
        }
    });
    return sharedSingleton;
}
  • 这里用一个静态变量是为了确保它在类中的全局可用性
  • 利用dispatch_once是为了保证初始化代码只执行一次

为了贯彻单例的思想,需要重写的一些方法

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

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

- (id)retain {
        return self;
}

- (id)autorelease {
        return self;
}

- (void)release {

}

- (NSUInteger)retainCount {
        return NSUIntegerMax;
}

单例模式的应用:

假如我们需要在iOS应用中实现分层的架构设计,即我们需要把数据的持久层,展示层,和逻辑层分开。为了突出重点,我们直接把目光转到持久层,而根据MVC的设计模式,我们又可以把持久层细分为DAO层(放置访问数据对象的四类方法)和Domain层(各种实体类,比如学生),这样就可以使用DAO层中的方法,配合实体类Domain层对数据进行清晰的增删改查。那么我们如何设计呢?

从使用者的角度看,我们期望获得DAO层的类实例,然后调用它的增删改查四大方法。可是这个类实例,我们似乎只需要一个就足够了,再多的话不利于管理且浪费内存。OK,我们可以使用单例模式了,代码如下:
.h文件:

//StudentDAO.h
@interface StudentDAO:NSObject
@property (nonatomic,strong) NSMutaleArray *StudentsInfo;

+ (StudentDAO *)sharedStudentDAO;

-(int) create:(Student*)student;
-(int) remove:(Student*)student;
-(int) modify:(Student*)student;
-(NSMutaleArray) findAll;
@end

.m

//StudentDAO.m
#import "StudentDAO.h"
#import "Student.h"
@implementation StudentDAO

static StudentDAO *studentDao = nil;
+ (StudentDAO)sharedStudentDAO{
    static dispatch_once_t once;
    dispatch_once(&once,^{
        Student  *student1 = [[Student alloc]init];
        student1.name = "MexiQQ";
        student1.studentNum = "201200301101";

        Student  *student2 = [[Student alloc]init];
        student2.name = "Ricardo_LI";
        student2.studentNum = "201200301102";

        studentDao = [[self alloc] init];
        studentDao._StudentsInfo = [[NSMutaleArray alloc]init];
        [studentDao._StudentsInfo addObject:student1];
        [studentDao._StudentsInfo addObject:student2];
    });
    return studentDao;
}   
//插入的方法
-(int)create:(Student*)stu{
    [self._StudentsInfo addObject:stu];
    return 0;
}   
//删除的方法
-(int)remove:(Student*)stu{
    for(Student* s in self._StudentsInfo){
        if([stu.studentNum isEqual:s.studentNum]){
            [self._StudentsInfo removeObject:s]
            break;
        }
    }
}
-(int)modify...... //省略不写
-(NSMutaleArray)findAll...... //省略不写

参考文章:https://segmentfault.com/a/1190000000768605

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值