• iOS-单例模式(懒汉式和饿汉式)和GCD实现


    //
    //  HMMusicTool.h
    //  03-单例模式-Singleton(掌握)
    //
    //  Created by apple on 14-9-16.
    //  Copyright (c) 2014年 heima. All rights reserved.
    //  播放音乐
    
    #import <Foundation/Foundation.h>
    
    @interface HMMusicTool : NSObject
    + (instancetype)sharedMusicTool;
    @end



    //
    //  HMMusicTool.m
    //  03-单例模式-Singleton(掌握)
    //
    //  Created by apple on 14-9-16.
    //  Copyright (c) 2014年 heima. All rights reserved.
    //  懒汉式
    
    #import "HMMusicTool.h"
    
    @implementation HMMusicTool
    static id _instance;
    
    /**
     *  alloc方法内部会调用这个方法
     */
    + (id)allocWithZone:(struct _NSZone *)zone
    {
        if (_instance == nil) { // 防止频繁加锁
            @synchronized(self) {
                if (_instance == nil) { // 防止创建多次
                    _instance = [super allocWithZone:zone];
                }
            }
        }
        return _instance;
    }
    
    + (instancetype)sharedMusicTool
    {
        if (_instance == nil) { // 防止频繁加锁
            @synchronized(self) {
                if (_instance == nil) { // 防止创建多次
                    _instance = [[self alloc] init];
                }
            }
        }
        return _instance;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _instance;
    }
    @end
    //
    //  HMDataTool.h
    //  03-单例模式-Singleton(掌握)
    //
    //  Created by apple on 14-9-16.
    //  Copyright (c) 2014年 heima. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface HMDataTool : NSObject
    + (instancetype)sharedDataTool;
    @end
    
    
    //
    //  HMDataTool.m
    //  03-单例模式-Singleton(掌握)
    //
    //  Created by apple on 14-9-16.
    //  Copyright (c) 2014年 heima. All rights reserved.
    //
    
    #import "HMDataTool.h"
    
    @implementation HMDataTool
    // 用来保存唯一的单例对象
    static id _instace;
    
    + (id)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instace = [super allocWithZone:zone];
        });
        return _instace;
    }
    
    + (instancetype)sharedDataTool
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instace = [[self alloc] init];
        });
        return _instace;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _instace;
    }
    
    @end
  • 相关阅读:
    解决SVN创建补丁乱码问题
    一款监控网络状态的好工具 Smokeping
    微软“2052”文件夹什么意思
    SVN目录大小写漏洞
    探索Emberjs——了解Emberjs
    第一次尝试三层架构<实现简单的增、删、查、改>
    站内搜索1之开篇介绍
    原生的几个javascript常用特效
    如果你喜欢上了一个程序员小伙>献给所有的程序员女友
    站内搜索3之Lucene.Net使用
  • 原文地址:https://www.cnblogs.com/zhuyaguang/p/4853382.html
Copyright © 2020-2023  润新知