• iOS 单例模式


    单例模式”是我在iOS中最常使用的设计模式之一。单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题。单例类是一个非常重要的概念,因为它们表现出了一种十分有用的设计模式。单例类的应用贯穿于整个iOS的SDK中。例如,UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用程序相关联的UIApplication实例。除了这个,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(应用程序设置) 、NSURLCache(请求缓存)、NSHTTPCookieStorage(应用程序cookies池)都是系统单例;单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外界访问。

    单例模式的要点:

      一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

    单例模式的优点:

      1.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。
      2.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
    IOS中的单例模式:
      在objective-c中要实现一个单例类,至少需要做以下四个步骤:
      1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
      2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
      3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
      4、适当实现copyWithZone,release和autorelease。
     
    单例模式的实现:

    代码示例:

    MySingletonClass.h

    #import <Foundation/Foundation.h>
    
    @interface MySingletonClass : NSObject
    //单例方法
    +(MySingletonClass *)sharedInstance; @end

    MySingletonClass.m

    #import "MySingletonClass.h"
    
    @implementation MySingletonClass
    
    //1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
    static MySingletonClass *manager = nil;
    
    //2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
    +(MySingletonClass *)sharedInstance{
        
        @synchronized(self) {
            if(manager == nil) {
                manager = [[MySingletonClass  alloc] init]; //   assignment   not   done   here
            }
        }
        return manager;
    }
    
    //3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
    +(id)allocWithZone:(NSZone *)zone{
        @synchronized(self){
            
            if (!manager) {
                
                manager = [super allocWithZone:zone]; //确保使用同一块内存地址
                
                return manager;
                
            }
            
            return nil;
        }
    }
    
    //4、适当实现copyWithZone,release和autorelease。
    - (id)init;
    {
        @synchronized(self) {
            
            if (self = [super init]){
                
                return self;
            }
            
            return nil;
        }
    }
    
    //确保copy对象也是唯一
    - (id)copyWithZone:(NSZone *)zone;{
        
        return self;
        
    }

    本文示例源码下载:http://www.oschina.net/code/snippet_2337537_52413

    参考链接:

    http://www.cnblogs.com/lyanet/archive/2013/01/11/2856468.html

    http://blog.sina.com.cn/s/blog_71715bf80101a8mm.html

     
     
  • 相关阅读:
    算法初步-插入排序
    [数据结构]之栈
    [数据结构]之队列
    [数据结构]之链表
    [数据结构]之顺序表
    SDL一环境配置
    三大框架结构的原理及其优点
    hibernate----hibernate的基础设置
    其他
    struts----用Action的属性接收参数
  • 原文地址:https://www.cnblogs.com/jukaiit/p/4997340.html
Copyright © 2020-2023  润新知