zoukankan      html  css  js  c++  java
  • Objective-c 单例设计模式

    Objective-c 单例设计模式

    一、什么是单例模式:(Singleton)
         单例模式的意图是是的类的对象成为系统中唯一的实例,提供一个访问点,供客户类共享资源。
     
    二、什么情况下使用单例?
         1、类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。
         2、这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。
     

    三、单例设计模式的要点:(1) 某个类只能有一个实例。  (2)他必须自行创建这个对象  (3)必须自行向整个系统提供这个实例; (4)为了保证实例的唯一性,我们必须将 -(id)copyWithZone:(NSZone *)zone  、+(id)allocWithZone:(NSZone *)zone、 -(id)retain、  -(NSUInteger)retainCount 、-(oneway void)release

     、-(id)autorelease  的实现方法进行覆盖。(具体实现请看程序)  (5)这个方法必须是一个静态类
     
    四、在OC中实现单例模式:
         先创建一个单例类,即:
        #import <Foundation/Foundation.h>

        @interface Bee : NSObject<NSCopying>//注意此处调用了NScoping协议

        +(Bee *)shareIsrance;//此处定义了一个工厂方法,用工厂方法来限制实例化过程(下文中将会提到)

         @end    //调用NScoping协议,从而在实现文件中覆盖

       

       在实现文件中实现如下:

    #import "Bee.h"

    @implementation Bee

    static Bee  *sharesingleton=nil;//必须声明为一个静态方法

    +(Bee *)shareIstance

    {

        if (sharesingleton == nil) {//检查唯一实例是否创建

            sharesingleton = [[super allocWithZone:NULL] init ];

    // 这里不是使用alloc,而是调用[[super allocWithZone:NULL] init ] ,为什么是super而不是self呢? 这是因为已经在self中冲在了基本对象的分配方法,所以需要借用父类的(NSobject)的功能帮助处理底层内存分配的杂务;    

        }

        return sharesingleton;

    }

    // 覆盖NSObject方法

    +(id)allocWithZone:(NSZone *)zone

    {

        return [[self shareIstance] retain];

    }

    -(id)copyWithZone:(NSZone *)zone

    {

        return self;//覆盖父类 NScoping 中的方法

    }

    -(id)retain

    {

        return self;

    }

    -(NSUInteger)retainCount

    {

        return NSUIntegerMax;//无穷大的数,表示不能释放

    }

    -(oneway void)release

    {

        //什么也不做

    }

    -(id)autorelease

    {

        return self;

    }

    @end

    注意:所谓单例,即我们自己创建一个单例,该类只能生成唯一的对象,即用  if (sharesingleton == nil)    方法来保证唯一性,为了防止该对象被复制(copy)或者retain 和 release 等操作,我们必须在所创建的单例的实现文件( .m 文件)中将父类的这些方法给覆盖,该目的是为了保证单例模式的一个严谨性。

  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/YangFuShun/p/4505674.html
Copyright © 2011-2022 走看看