【iOS7的一些总结】15、单例设计模式

1、基本概念

所谓单例,即某一个类始终只能返回一个实例,也可以理解为类本身就是一个实例。单例类通常适合作为某些保存全局应用信息的全局对象,以及部分耗费大量系统资源的重量级对象。通过这种模式可以更简洁地涉及代码,或者提高应用的性能。常用的单例类有NSFileManager、NSUserDefault等。


2、创建单例涉及模式的基本步骤

(1)创建单例对象的静态实例,初始化为nil;

(2)创建类的类工厂方法,只有在这个类的实例为nil时生成一个该类的实例;

(3)重写allocWithZone方法,防止在alloc时产生另一个对象;

(4)实现NSCopy协议,覆盖release、autorelease、retain、retainCount方法以保证单例的状态;

(5)多线程环境中,使用@synchronized关键字,确保静态实例正确创建和初始化。

以下是一个单例类的定义事例:

//
//  UserContext.h
//  SingletonDemo
//
//  Created by YinWenjie on 14-12-11.
//  Copyright (c) 2014年 YinWenjie. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface UserContext : NSObject

@property (nonatomic, copy) NSString *strName;
@property (nonatomic, copy) NSString *strAddr;

+ (id)shareContext;

@end
//
//  UserContext.m
//  SingletonDemo
//
//  Created by YinWenjie on 14-12-11.
//  Copyright (c) 2014年 YinWenjie. All rights reserved.
//

#import "UserContext.h"

static UserContext *singletonInstance = nil;

@implementation UserContext

+ (id)shareContext
{
    @synchronized(self)
    {
        if (singletonInstance == nil)
        {
            singletonInstance = [[[self class] alloc] init];
        }
    }
    return singletonInstance;
}

#pragma mark - Make sure that only one instance is created
+ (id)allocWithZone:(struct _NSZone *)zone
{
    if (singletonInstance == nil)
    {
        singletonInstance = [super allocWithZone:zone];
    }
    return singletonInstance;
}

- (id)copyWithZone:(struct _NSZone *)zone
{
    return singletonInstance;
}

- (id)retain
{
    return singletonInstance;
}

- (oneway void)release
{
    
}

- (id)autorelease
{
    return singletonInstance;
}

- (NSUInteger)retainCount
{
    return UINTMAX_MAX;
}

@end


上一篇:Firefox 23.0新版浏览器的变化比较大,你如果经常捣鼓firefox的选项卡的人可能已经发现了,选项卡很多地方多有所改变。


下一篇:《Spring 手撸专栏》第 9 章:虎行有雨,定义标记类型Aware接口,实现感知容器对象