11.单例设计模式

1.单例的基本概念

  1. 单例设计模式运用较为普遍,广泛且较为简单的设计模式之一,它的设计原理是始终返回一个实例,即一个类始终只有一个实例.
  2. 创建单例设计模式的基本步骤:
    1) 声明一个单例对象的静态实例,并初始化为nil;
    2) 创建一个类的类工厂方法,生成一个该类的实例,当且仅当这个类的实例为nil时
    3) 覆盖allocWithZone:方法,确保用户(程序员)在直接分配和初始化对象是,不会产生另一个对象.
    4) 实现NSCopying协议,覆盖release,autorelease,retain,retainCount方法,以此确保单例的状态.
    5) 在多线程环境中,注意使用@synchronized(同步锁)关键字,确保静态实例被正确的创建和初始化;

2.UserContext.h和UserContext.m文件

#import <Foundation/Foundation.h>
@interface UserContext : NSObject<NSCopying>

@property(nonatomic,copy)NSString *userName;
@property(nonatomic,copy)NSString *email;
+ (id)shareUserContext;

@end
#import "UserContext.h"

static UserContext *segtonInstance = nil;

@implementation UserContext

+ (id)shareUserContext {

    @synchronized(self){
        if (segtonInstance == nil) {
            segtonInstance = [[[self class] alloc] init];
        }
    }
    return segtonInstance;
}

#pragma mark - 下面的方法为了确保只有一个实例对象
+ (id)allocWithZone:(NSZone *)zone {
    if (segtonInstance == nil) {
        segtonInstance = [super allocWithZone:zone];
    }
    return segtonInstance;
}

- (id)copyWithZone:(NSZone *)zone {
    return segtonInstance;
}

- (id)retain {
    return segtonInstance;
}

- (oneway void)release {
}

- (id)autorelease {
    return segtonInstance;
}

- (NSUInteger)retainCount {
    return UINT_MAX;
}

@end

3.main.m文件

 UserContext *userContext = [UserContext shareUserContext];
        UserContext *userContext2 = [UserContext shareUserContext];
        UserContext *userContext3 = [[UserContext alloc] init];
        UserContext *userContext4 = [userContext copy];
        //上面几个对象指向同一个地址
        [userContext release];
        [userContext release];
        [userContext release];
        [userContext release];        
        NSLog(@"%p",userContext);//--->0x100109ec0
        NSLog(@"%p",userContext2);//--->0x100109ec0
        NSLog(@"%p",userContext3);//--->0x100109ec0
        NSLog(@"%p",userContext4);//--->0x100109ec0

4.课堂内容单例

Singleton.h和Singleton.m文件

#import <Foundation/Foundation.h>
@interface Singleton : NSObject
@property(nonatomic,copy)NSString *userName;
+ (Singleton *)shareSingleton;
@end
#import "Singleton.h"
@implementation Singleton

+ (Singleton *)shareSingleton{
    //定义一个静态实例
    static Singleton *single;

    if (single == nil) {//不安全
        single = [[Singleton alloc] init];
    }

    //关键字@synchronized同步锁,表示同一时间只能有一个线程访问
    @synchronized(self){
        if(single == nil){
            single = [[Singleton alloc] init];
        }
    }

    static dispatch_once_t oneToken;
    //能保证当前这个对象只能被创建一次
    dispatch_once(&oneToken, ^{
        single = [[Singleton alloc] init];
    });

    return single;
}
@end

ViewController.m文件的viewDidLoad方法里面

- (void)viewDidLoad {
    //使用前面创建的单例对象
    [Singleton shareSingleton].userName = @"zhangsan";
    NSLog(@"%@",[Singleton shareSingleton].userName);
    // 1.[UIScreen mainScreen] 2.[NSFileManager defaultManager] 3.[NSUserDefaults standardUserDefaults] 4.[NSBundle mainBundle]
    //系统为了保证某些对象在工程里唯一,使用单例创建对象,如上四个.单例方法一般都是+号方法,放回当前类型的对象,方法一般以些关键词开头:share,main,default然后加上类名就是一个单例
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值