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:

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

posted @ 2015-07-19 18:17  驴车手  阅读(156)  评论(0编辑  收藏  举报