单例模式(OC)

作者: Little_Dragon | 来源:发表于2015-09-27 15:13 被阅读276次

1.单例模式的作用
1>可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问 (这个苹果系统给我们提供很多单例的形式: 如share开头的类方法, default开头的类方法等等)

// 文件管理
    NSFileManager *manager = [NSFileManager defaultManager];
     NSFileManager *manager2 = [NSFileManager defaultManager];
     NSFileManager *manager3 = [NSFileManager defaultManager];
     NSFileManager *manager4 = [NSFileManager defaultManager];
    NSLog(@"\n%@\n%@\n%@\n%@",manager,manager2,manager3,manager4);
// 程序管理
    [UIApplication sharedApplication];
// 设置(偏好设置)
    [NSUserDefaults standardUserDefaults];

控制台输出:


Snip20150927_1.png

2> 方便的控制实例个数, 并且节约系统资源

2.单例模式的使用场合
1>资源只需要初始化一次,在程序中,共享一份资源

单例模式的创建过程

1.在ARC中,在.m文件中,保留一个全局的static的实例
static id _instance;
2.重写+ allocWithZone:此方法在调用alloc时必会调用. 对于alloc方法,相信大家并不是很陌生, alloc方法,的主要作用就是为了给新创建的对象分配存储空间用的.
所以在这里创建唯一的实例(不过要注意线程安全)[前一段学习了 一次性代码, 将代码块放在一次性代码内部,便可以只执行一次,也就是只分配了一次性内存]

  1. 有人会说,懒加载也可以,但是懒加载会造成资源抢夺的问题,为了解决这个问题,可以添加互斥锁,用来解决.
// 重写allocWithZone方法,
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
// 执行一次性代码
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
if (_instance == nil) {
            NSLog(@"我爱你");
            _instance = [super allocWithZone:zone];
        }
    });
// 创建实例
    return _instance;
}
  1. 提供1个类方法让外界访问唯一的实例 + shareInstance[方法名必须有意义,见名知意]
// 自定义单例方法
+ (instancetype)shareInstance
{
return [[self alloc]init];
}
  1. 对于单例,应该无论以何种方式创建都应该只有一份内存的, 对于ARC的创建的方法还有copy``mutableCopy,但必须遵守协议<NSCopying,NSMutableCopying> , 执行copy,MutableCopy的时候必定会执行copyWithZone``mutableCopyWithZone
- (id)copyWithZone:(struct _NSZone *)zone
{
    return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{

    return _instance;
}

MRC创建单例,和ARC基本相同, 只不过ARC是自动引用计数器, 会自动释放.MRC必须手动释放内存

1.多了一个new的类方法创建方法:

// 创建方法:new
+ (instancetype)new
{
    return [[self alloc]init];
}

2.多了一个retain的对象方法创建方法:

- (instancetype)retain
{
    return _instance;
}
  1. 分配一份内存,永远不要被release
- (oneway void)release
{
}
  1. 专业一点,让其返回最大计数,让人一看就知道是单例
- (NSUInteger)retainCount
{
    return MAXFLOAT;
}

5.对象销毁的时候,必须调用dealloc

- (void)dealloc
{
    [super dealloc];
    NSLog(@"被销毁了");
}

相关文章

  • iOS-单例模式

    swift的单例设计模式 OC的单例设计模式 新学习一种单例思想

  • iOS模式解析-单例模式

    设计模式-单例模式 1、为什么用单例模式 1.1、OC编程习惯 xcode 4.2之前使用MRCalloc创建的对...

  • 单例模式的书写

    ARC OC 中的单例 根据OC单例 改写成 Swift 中的单例 OC调用swift,需要#import "单例...

  • iOS 常见设计模式

    单例模式 代理模式 观察者模式 工厂模式 单例模式 load: 当类加载到OC运行时环境中(内存), 掉会调用一次...

  • iOS开发技巧(Swift版):单例创建

    在些项目的时候, 我们往往会用到单例模式,.相比OC中单例的写法, 结合Swift的语法特点,总结一下3种单例模式...

  • OC 单例模式

  • 单例模式(OC)

    1.单例模式的作用1>可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问 (这个苹果系统给我们...

  • OC - 单例模式

    导读: 一、什么是单例模式 二、单例的作用 三、常见的单例类 四、自定义单例类的方法 一、什么是单例模式 单例模式...

  • OC-多线程-单例模式

    OC-多线程-单例模式 说起单例,我们一般使用GCD的dispath_once来创建单例 对于单例,需要知道以下两...

  • swiftly单例

    swiftly的单例比OC的更加简单! Oc中的单例:

网友评论

    本文标题:单例模式(OC)

    本文链接:https://www.haomeiwen.com/subject/qpbicttx.html