单例模式(OC)

作者: Little_Dragon | 来源:发表于2015-09-27 15:13 被阅读276次

    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(@"被销毁了");
    }
    

    相关文章

      网友评论

        本文标题:单例模式(OC)

        本文链接:https://www.haomeiwen.com/subject/qpbicttx.html