<pre name="code" class="objc">单例模式就是只有一个实例,确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例,一个单例类可以实现在不同的窗口之间传递数据。
在oc中要实现一个单例类,至少需要做以下四个步骤:
1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
4、再写一个copyWithZone 防止其他人copy 生成新的实例。
/**
* Student.h文件
*
*/
#import <Foundation/Foundation.h>
@interface Student : NSObject
//在要设计成单例类的 .h 文件声明一个构造的单例方法
+ (Student *)sharedStudent;
@end
/**
* Student.m 文件
*/
#import "Student.h"
//声明一个静态实例对象 只能执行一次
static Student *stu = nil;
@implementation Student
+ (Student *)sharedStudent
{
if (stu == nil) {
stu = [[Student alloc] init];
}
return stu;
}
//为了防止 allco 或 new 创建实例变量
+ (id)allocWithZone:(struct _NSZone *)zone
{
//@synchronized(self){} 这叫锁令牌。这里可以解决线程问题。可以理解为不管谁来了都要排队
@synchronized(self) {
if (stu == nil) {
stu = [super allocWithZone:zone];
}
return stu;
}
}
//防止copy
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
@end
/**
* main.m
*
*/
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
设计模式:(用来解决编程某些特定的问题)
单例模式
什么时候使用单例
在一个工程中。一些类只需要一个实例变量,我们就可以这些类定义成单例模式
单例模式的实现思路:一个类只能创建一个实例个一个获得实例方法
*/
Student *student1 = [Student sharedStudent];
Student *student2 = [[Student alloc] init];
if (student1 == student2) {
NSLog(@"YES");
}
Student *student3 = [student2 copy];
if (student2 == student3) {
NSLog(@"YES");
}
}
return 0;
}