zoukankan      html  css  js  c++  java
  • 1月22号 单例设计模式

     

    单例应用场合

    在iOS的生命周期内,有时候我们只需要某个类的一个实例。

    例如UIApplication, UIAccelerometer, NSUserDefaults, NSNotificationCenter, NSFileManger, NSBundle这些都是单例类的典型代表。

    如何创建单例类

    1. 创建一个静态对象
    2. 提供一个静态方法
    3. 重写alloc方法

    代码演示

    我们首先创建一个类FileOperation, 继承自NSObject.

    添加一个静态全局变量:

    1 static FileOperation *instance = nil;

    创建一个静态的方法

    1 + (instancetype)sharedOperation{
    //返回对象前需要判断,这个对象之前是否创建过,如果没有创建过,就需要创建一个对象,如果创建过,就把上一次的对象返回出去。这样可以保证创建的对象是唯一的对象
    2 if (instance == nil) { 3 instance = [[super allocWithZone:NULL] init]; 4 } 5 return instance; 6 }

    既然用户可能用静态方法创建对象,那么用户有没有可能使用allocWithZone创建对象呢?

    我们在此又需要重写allocWithZone这个方法:

    1 + (instancetype)allocWithZone:(struct _NSZone *)zone{
    2     if (instance == nil) {
    3         instance = [[self alloc] init];
    4     }
    5     return instance;
    6 }

    基本代码是:

     1 #import "FileOperation.h"
     2 
     3 //定义一个静态变量
     4 //作用域:从定义开始到整个程序结束
     5 static FileOperation *instance = nil;
     6 
     7 @implementation FileOperation
     8 
     9 + (instancetype)sharedOperation{
    10     if (instance == nil) {
    11         instance = [[super allocWithZone:NULL] init];
    12     }
    13     return instance;
    14 }
    15 
    16 
    17 
    18 + (instancetype)allocWithZone:(struct _NSZone *)zone{
    19     if (instance == nil) {
    20         instance = [[self alloc] init];
    21     }
    22     return instance;
    23 }
    24 
    25 
    26 @end

    上述的代码只是在ARC中可以正确使用,如果实在MRC中,有retain,copy,release, autorelease,这些方法都会使得引用计数变化,我们都需要对这些方法重写。

     1 -(id)retain
     2 {
     3     return instance;
     4 }
     5 -(void)release
     6 {
     7      
     8 }
     9 -(id)autorelease
    10 {
    11     return instance;
    12 }
    13 -(id)copy
    14 {
    15     return instance;
    16 }
    17 -(NSUInteger)retainCount
    18 {
    19     return 1;
    20 }

    接下去检测一下生成的对象是不是相同的

    1 FileOperation *f1 = [FileOperation sharedOperation];
    2         FileOperation *f2 = [FileOperation sharedOperation];
    3         FileOperation *f3 = [[FileOperation alloc] init];
    4         FileOperation *f4 = [[FileOperation alloc] init];
    5         
    6         NSLog(@"f1:%p", f1);
    7         NSLog(@"f2:%p", f2);
    8         NSLog(@"f3:%p", f3);
    9         NSLog(@"f4:%p", f4);

    打印出来的结果如下

    所以是相同的对象!

  • 相关阅读:
    android SD卡文件的读写
    Android Junit 单元测试步骤
    android xml解析之SAX
    android赚钱 植入有米广告方法
    android广告平台介绍
    读、写其他应用的SharedPreferences
    SQL数据基本操作
    res/raw下的资源文件读写
    容易吗?
    写给实习生的邮件
  • 原文地址:https://www.cnblogs.com/hmzxwky/p/5150733.html
Copyright © 2011-2022 走看看