iOS中,ARC的环境下的单例模式。

来源:互联网 发布:中国联通网络测速平台 编辑:程序博客网 时间:2024/06/06 00:05

一、简单说明:

设计模式:大牛们多年的软件开发,总结出来的一套经验、方法和工具。

 在ios中最常用的是单例模式和代理模式。

二、单例模式说明

(1)单例模式的作用 :可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。

(2)单例模式的使用场合:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),应该让这个类创建出来的对象永远只有一个。

 所以单例模式的核心就是让该类只会被分配一次内存空间,最好只会被初始化一次。

三、在ARC中单例模式的实现

1、在.m中保留一个全局的static的实例   static id _instance;

static DHPerson *_person;

2、重写+ (instancetype)allocWithZone:(struct _NSZone *)zone;

或者+ (instancetype)alloc;

3、重写- (instancetype)init;

4、提供一个类方法

+ (instancetype)sharedPerson;

代码如下:

DHPerson.h文件

@interface DHPerson : NSObject

@property (nonatomic, copy, readonly) NSString *name;

@property (nonatomic, assign, readonly) NSInteger age;

+ (instancetype)sharedPerson;

 

@end

DHPerson.m文件

#import "DHPerson.h"


@implementation DHPerson


static DHPerson *_person;

// 实现这个方法或者+ (instancetype)alloc都可以的,alloc方法中系统会自动调用这个方法,所以实现这个或者+ (instancetype)alloc都可以的

+ (instancetype)allocWithZone:(struct _NSZone *)zone

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        

        _person = [super allocWithZone:zone];

        

        NSLog(@"alloc只有一次哦");

    });

    return _person;

}


+ (instancetype)alloc

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        

        _person = [super alloc];

        NSLog(@"alloc只有一次哦");

    });

    return _person;

}


+ (instancetype)sharedPerson

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _person = [[DHPerson allocinit];

    });

    return _person;

}

- (instancetype)init

{

    static id obj;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        if ((obj = [super init])) {


            // 假设该属性很耗很耗内存,就可以在这里初始化

            _name = @"jack";

            _age = 20;            

        }

    });

    self = obj;

    return self;

}

+ (id)copyWithZone:(struct _NSZone *)zone

{

    return _person;

 

}

@end

0 0