单例模式(OC)

1.单例模式的作用
1>可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问 (这个苹果系统给我们提供很多单例的形式: 如share开头的类方法, default开头的类方法等等)

// 文件管理
    NSFileManager *manager = [NSFileManager defaultManager];
     NSFileManager *manager2 = [NSFileManager defaultManager];
     NSFileManager *manager3 = [NSFileManager defaultManager];
     NSFileManager *manager4 = [NSFileManager defaultManager];
    NSLog(@"\n%@\n%@\n%@\n%@",manager,manager2,manager3,manager4);
// 程序管理
    [UIApplication sharedApplication];
// 设置(偏好设置)
    [NSUserDefaults standardUserDefaults];

控制台输出:


Snip20150927_1.png

2> 方便的控制实例个数, 并且节约系统资源

2.单例模式的使用场合
1>资源只需要初始化一次,在程序中,共享一份资源

单例模式的创建过程

1.在ARC中,在.m文件中,保留一个全局的static的实例
static id _instance;
2.重写+ allocWithZone:此方法在调用alloc时必会调用. 对于alloc方法,相信大家并不是很陌生, alloc方法,的主要作用就是为了给新创建的对象分配存储空间用的.
所以在这里创建唯一的实例(不过要注意线程安全)[前一段学习了 一次性代码, 将代码块放在一次性代码内部,便可以只执行一次,也就是只分配了一次性内存]

  1. 有人会说,懒加载也可以,但是懒加载会造成资源抢夺的问题,为了解决这个问题,可以添加互斥锁,用来解决.
// 重写allocWithZone方法,
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
// 执行一次性代码
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
if (_instance == nil) {
            NSLog(@"我爱你");
            _instance = [super allocWithZone:zone];
        }
    });
// 创建实例
    return _instance;
}
  1. 提供1个类方法让外界访问唯一的实例 + shareInstance[方法名必须有意义,见名知意]
// 自定义单例方法
+ (instancetype)shareInstance
{
return [[self alloc]init];
}
  1. 对于单例,应该无论以何种方式创建都应该只有一份内存的, 对于ARC的创建的方法还有copy``mutableCopy,但必须遵守协议<NSCopying,NSMutableCopying> , 执行copy,MutableCopy的时候必定会执行copyWithZone``mutableCopyWithZone
- (id)copyWithZone:(struct _NSZone *)zone
{
    return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{

    return _instance;
}

MRC创建单例,和ARC基本相同, 只不过ARC是自动引用计数器, 会自动释放.MRC必须手动释放内存

1.多了一个new的类方法创建方法:

// 创建方法:new
+ (instancetype)new
{
    return [[self alloc]init];
}

2.多了一个retain的对象方法创建方法:

- (instancetype)retain
{
    return _instance;
}
  1. 分配一份内存,永远不要被release
- (oneway void)release
{
}
  1. 专业一点,让其返回最大计数,让人一看就知道是单例
- (NSUInteger)retainCount
{
    return MAXFLOAT;
}

5.对象销毁的时候,必须调用dealloc

- (void)dealloc
{
    [super dealloc];
    NSLog(@"被销毁了");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容