• iOS常用设计模式之单例模式


            单例模式是iOS设计模式中常用的一种设计模式,它的意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的作用就是为了解决“应用中只有一个实例”这一类问题。

            单例模式一般会封装一个静态属性,并提供静态实例的创建方法。下面上代码:

    //
    //  Singleton.h
    //  DesignPatternsDemo
    //
    //  Created by 韩学鹏 on 15/6/19.
    //  Copyright (c) 2015年 韩学鹏. All rights reserved.
    //
    
    #import @interface Singleton : NSObject
    
    + (Singleton *)shareManager;
    
    
    @end
    //
    //  Singleton.m
    //  DesignPatternsDemo
    //
    //  Created by 韩学鹏 on 15/6/19.
    //  Copyright (c) 2015年 韩学鹏. All rights reserved.
    //
    
    #import "Singleton.h"
    
    @implementation Singleton
    
    static Singleton *_shareManager = nil;
    
    + (Singleton *)shareManager {
        static dispatch_once_t once;
        dispatch_once(&once, ^{
            _shareManager = [[self alloc] init];
        });
        
        return _shareManager;
    }
    
    @end

            如果使用者能严格按照要求来使用给定的方法,这个单例还是可以的,但是,如果不小心调用了其他可以生成对象的方法,那这个单例就失去了它的作用。所以,这个单例还需要改造:

            1、重写allocWithZone方法,保证使用者在调用alloc或者init的时候不会产生新的对象。

            2、重写copyWithZone和mutableCopyWithZone方法,保证使用者在进行对象复制的时候不会产生新的对象。

            3、看情况重写retain、retainCount、release和autorelease方法。(ARC模式下需要注释掉)

            重新改造的单例如下:

    //
    //  Singleton.m
    //  DesignPatternsDemo
    //
    //  Created by 韩学鹏 on 15/6/19.
    //  Copyright (c) 2015年 韩学鹏. All rights reserved.
    //
    
    #import "Singleton.h"
    
    @implementation Singleton
    
    static Singleton *_shareManager = nil;
    
    + (Singleton *)shareManager {
        static dispatch_once_t once;
        dispatch_once(&once, ^{
            _shareManager = [[self alloc] init];
        });
        return _shareManager;
    }
    
    
    
    + (id)allocWithZone:(struct _NSZone *)zone {
        static dispatch_once_t once;
        dispatch_once(&once, ^{
            _shareManager = [super allocWithZone:zone];
        });
        
        return _shareManager;
    }
    
    
    - (id)copyWithZone:(NSZone *)zone {
        return _shareManager;
    }
    
    - (id)mutableCopyWithZone:(NSZone *)zone {
        return [self copyWithZone:zone];
    }
    /*   ARC无效时
    - (id)retain {
        return _shareManager;
    }
    
    - (NSUInteger)retainCount {
        return 1;
    }
    
    
    - (oneway void)release {
        
    }
    
    - (id)autorelease {
        return _shareManager;
    }
    */
    
    @end

    测试代码和输入输出结果:

        id obj = [Singleton new];
        id obj1 = [Singleton shareManager];
        id obj2 = [[Singleton alloc] init];
        
        NSLog(@"obj:%@", obj);
        NSLog(@"obj1:%@", obj1);
        NSLog(@"obj2:%@", obj2);

            输出:

    2015-06-19 19:15:27.452 DesignPatternsDemo[24125:607] obj:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj1:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj2:

    附上这个类的下载地址:单例

  • 相关阅读:
    管道流
    构造方法中用泛型
    代码实现长提闪烁
    关联事件,向窗体中添加控件,设置控件属性等系列操作
    picturebox中添加图片
    typeof gettype
    groupbox
    static用法
    运算符重载
    类修饰符
  • 原文地址:https://www.cnblogs.com/arthas/p/4659130.html
Copyright © 2020-2023  润新知