objective-c 单例模式 singleton

先把参考的文档列出来:

http://www.cnblogs.com/supercheng/archive/2012/11/26/singlemodal.html

http://arthurchen.blog.51cto.com/2483760/642536/

http://blog.csdn.net/duboleon/article/details/6337174

https://developer.apple.com/legacy/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32

https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html

《大话设计模式》

http://www.cocoachina.com/industry/20130510/6168.html

===============================================================================

singleton 单例模式 :保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实现单例模式需要重点考虑的是 多线程访问 引起的创建多个实例的情况。

未考虑多线程的代码如下:

//
//  myManager.h
//  singleton
//
//  Created by 一棋王 on 15-3-7.
//  Copyright (c) 2015年 一棋王. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface myManager : NSObject{
    NSString * _namer;
}

@property(nonatomic,retain) NSString * name;
+(id) sharedMyManager;
//sharedXXX,defaultXXX,currentXXX

@end

CarryOn 2015/3/10 19:44:49
//
//  myManager.m
//  singleton
//
//  Created by 一棋王 on 15-3-7.
//  Copyright (c) 2015年 一棋王. All rights reserved.
//

#import "myManager.h"

// 创建单例对象
static myManager * instance;

@implementation myManager

@synthesize name = _name;
+(id)sharedMyManager{
    if(instance == nil){
        instance = [[self alloc]init];
    }
    return instance;
}
@end
//
//  main.m
//  singleton
//
//  Created by 一棋王 on 15-3-7.
//  Copyright (c) 2015年 一棋王. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "myManager.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        myManager *tempObject1 = [myManager sharedMyManager];
        myManager *tempObject2 = [myManager sharedMyManager];

        NSLog(@"tempObject1 is %p",tempObject1);
        NSLog(@"tempObject2 is %p",tempObject2);
    }
    return 0;
}

//output
2015-03-07 00:51:03.865 singleton[752:303] tempObject1 is 0x100601c20
2015-03-07 00:51:03.871 singleton[752:303] tempObject2 is 0x100601c20
Program ended with exit code: 0

考虑多线程的代码,即推荐代码:

//
//  myManager.h
//  singleton
//
//  Created by 一棋王 on 15-3-7.
//  Copyright (c) 2015年 一棋王. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface myManager : NSObject{
    NSString * _namer;
}

@property(nonatomic,retain) NSString * name;
+(id) sharedMyManager;
//sharedXXX,defaultXXX,currentXXX

+(id)allocWithZone:(NSZone *)zone;
-(id)copyWithZone:(NSZone *)zone;
-(id)retain;
-(NSUInteger)retainCount;
-(id)autorelease;
-(oneway void)release;

@end
//
//  myManager.m
//  singleton
//
//  Created by 一棋王 on 15-3-7.
//  Copyright (c) 2015年 一棋王. All rights reserved.
//

#import "myManager.h"

// 创建单例对象
static myManager * instance;

@implementation myManager

@synthesize name = _name;
+(id)sharedMyManager{
    @synchronized(self){//synchronized关键字确保该段代码同时只有一个线程访问

        if(instance == nil){
        instance = [[self alloc]init];
        }
    }
    return instance;
}

+(id)allocWithZone:(NSZone *)zone{
    @synchronized(self){
        if(instance == nil){
            instance = [super allocWithZone:zone];
            return instance;
        }
        return nil;
    }
}

-(id)copyWithZone:(NSZone *)zone{
    return self;    //确保copy对象唯一。
}

-(id)retain{
    return self;    //确保计数唯一
}

-(NSUInteger)retainCount{
    return UINT_MAX;
}

-(id)autorelease{
    return self;
}

-(oneway void)release{
    //do nothing
}

@end

//还有一种GCD写法/*+(id)sharedMyManager{  static dispatch_once_t once;//保证once只使用一次  dispatch_once(&once,^{  if(instance == null){    instance = [[self alloc]init];  })  return instance;}*/

重写这些方法是为了采用其他方法声明实例时,也能遵守单例规则,即只存在一个对象。

时间: 2024-10-12 22:57:56

objective-c 单例模式 singleton的相关文章

.Net 单例模式(Singleton)

每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中.每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况.每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用. 问题描述: 单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这

单例模式——Singleton

模式分类: 从目的来看: 1.创建型(Creational)模式:负责对象创建. 2.结构型(Structural)模式:处理类于对象间的组合. 3.行为型(Behavioral)模式:类与对象交互中的职责分配. 从范围看: 1.类模式处理类于子类的静态关系. 2.对象模式处理对象间的动态关系. 动机 在软件系统中,经常有一些这样特殊的类,必须保证他们在系统中只存在一个实例,才能确保他们的逻辑正确性.以及良好的效率. 绕过常规的构造器,提供一种机制保证一个类只有一个实例. 意图 保证一个类仅有一

【白话设计模式四】单例模式(Singleton)

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

php设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 谷歌的Android设备 华为的Android设备 IOS只属于苹果公司 IOS只属于苹果公司 1 <?php 2 3 /* 4 * php

设计模式之——单例模式(Singleton)的常见应用场景(转):

单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一. 这里又不具体讲如何实现单例模式和介绍其原理(因为这方便的已经有太多的好文章介绍了),如果对单例模式不了解的可以先看下:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html . 好多没怎么使用过的人

Android - 单例模式(singleton)的使用

单例模式(singleton)的使用 本文地址:http://blog.csdn.net/caroline_wendy 单例(singleton)是特殊的Java类,在创建实例时,一个类仅允许创建一个实例. 应用能够在内存里存多久,单例就能存在多久,因此将对象列表保存在单例里可保持crime数据的一直存在, 不管activity.fragment及它们的生命周期发生什么变化. 要创建单例,需创建一个带有私有构造方法及get()方法类,其中get()方法返回实例. 如实例已存在,get()方法则直

二十四种设计模式:单例模式(Singleton Pattern)

单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using System.Collections.Generic; using System.Text; namespace Pattern.Singleton { /// <summary> /// 泛型实现单例模式 /// </summary> /// <typeparam name=&q

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

Android设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

设计模式之单例模式——Singleton

                    设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有公开的调用方法.而且,别的类不能实例化它,所以构造方法要设置为私有的. 单例模式的要点 一是某个类只能有一个实例: 二是它必须自行创建这个实例: 三是它必须自行向整个系统提供这个实例. 例如: 有一个"单例对象",而"客户甲"."客户乙" 和&quo