单例对象

在开发中经常需要使用单例对象。今天主要说的是单例宏

首先先简单介绍一下

1.单例设计模式(Singleton)

1> 什么: 它可以保证某个类创建出来的对象永远只有1个

2> 作用(为什么要用)

* 节省内存开销

* 如果有一些数据, 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的)

* 一般来说, 工具类设计为单例模式比较合适

3> 怎么实现

* MRC(非ARC)

* ARC

代码采用的是mrc的环境

单独创建一个.h文件 例如SingleTon.h

 1 //帮助实现单例设计模式
 2 /*
 3  alloc方法内部会调用allocWithZone
 4  */
 5
 6 #define SingletonH(methodName) +(instancetype)shared##methodName;
 7
 8 #if __has_feature(objc_arc)//是arc
 9
10 #define SingletonM(methodName)11 static id _instance = nil;12 13 +(instancetype)allocWithZone:(struct _NSZone *)zone14 {15     16     if(_instance == nil)17     {18         static dispatch_once_t onceToken;19         dispatch_once(&onceToken, ^{20             _instance = [super allocWithZone:zone];21         });22     }23     return _instance;24 }25 +(instancetype)shared##methodName26 {27     return [[self alloc]init];28 }29
30 #else//不是arc
31
32 #define SingletonM(methodName)33 static id _instance = nil;34 35 +(instancetype)allocWithZone:(struct _NSZone *)zone36 {37 38 if(_instance == nil)39 {40 static dispatch_once_t onceToken;41 dispatch_once(&onceToken, ^{42 _instance = [super allocWithZone:zone];43 });44 }45 return _instance;46 }47 -(oneway void)release48 {49 50 }51 52 -(instancetype)retain53 {54 return self;55 }56 -(NSUInteger)retainCount57 {58 return 1;59 }60 +(instancetype)shared##methodName61 {62 return [[self alloc]init];63 }
64
65 #endif

\代表的含义是说:下一行属于它  

然后在使用的时候

soundTool.h文件

#import <Foundation/Foundation.h>
#import "singleTon.h"
@interface soundTool : NSObject
SingletonH(sound)
@end

soundTool.m文件

#import "soundTool.h"

@implementation soundTool
//注意里边的方法名不要跟类名相同(大小写都不行得)
SingletonM(sound)

@end

然后在controller.m文件中

- (void)viewDidLoad {
    [super viewDidLoad];
    dataTool *d1 = [dataTool shareddatatools];
    dataTool *d2 = [dataTool shareddatatools];
    soundTool *s1 = [soundTool sharedsound];
    soundTool *s2 = [soundTool sharedsound];
    NSLog(@"%p %p ",d1,d2);
    NSLog(@"%p %p ",s1,s2);

这样就能报保证多个类都是单例的

有时候 出现mrc 跟arc 混编的状况

这样的话在个别的文件  的配置文件中追加 -fobjc-arc (说明是arc文件)

还有时候可能碰见这样的代码

 //补充
    NSArray *array = [[NSArray alloc]init];
    //判断如果不是arc状态的话  进行array的释放
    #if !__has_feature(objc_arc)
        [array release];
    #endif

这个说明判断如果不是arc环境的话 就要对array进行释放

时间: 2024-10-26 19:16:53

单例对象的相关文章

android里单例对象和某些数据被释放的问题

接触正式的android开发已经有一段时间了,项目的第一个版本终于快完成了.有一次自己在测试的时候,把自己的android项目切到后台,同时打开了几个应用之后重新切回到自己的app,发现报错了.经过排查,发现是自己的单例对象中的数据被释放掉了,也就是int变量的值 变成了0,string变量的值变成了null. 我的单例一开始是这样的(举例); public class UserInfo { private static UserInfo userInfo = null; private int

scala学习手记14 - 单例对象

java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传递参数. 下面是一个单例的示例: class Marker(val color: String) { println("Creating " + this) override def toString(): String = "marker color " + colo

iOS:创建单例对象的两种方式

单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClassManager*)sharedManager { @synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全 { if(singleManager == nil) { singleManager = [[SingleClassManager alloc]init]; } } return

Scala的单例对象

通常,一个类对应一个伴生对象,其方法就跟Java中的静态方法一样,举例:BigInt类的BigInt伴生对象有一个生成指定位数的随机素数的方法probablePrime,在REPL中运行下列代码: object HelloWorld{ def main(args:Array[String]){ for( i<- 1 to 10){ println(BigInt.probablePrime(10,scala.util.Random)); } } } 得到的结果如下: 523 977 839 911

atitit.guice3&#160;绑定方式打总结生成非单例对象toInstance&#160;toProvider区别&#160;v2&#160;pb29

atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29 1. 三 绑定方式的介绍1 2. To接口,链式绑定,用的最多的1 3. toConstructor1 4. toInstance生成的都是单例对象的...3 5. toProvider生成非单例对象3 5.2. 注解(Annotations)绑定3 5.3. 实例绑定(str,int绑定)4 5.4. 无目标绑定4 6. 参考5 重大的描述 1. 三 绑定方式的介绍 1. 在

【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象

为何将单例模式移除 在Cocos2d-JS v3.0之前.全部API差点儿都是从Cocos2d-x中移植过来的,这是Cocos2d生态圈统一性的重要一环.可惜的是,这样的统一性也在非常大程度上限制了Cocos2d-html5的发展,有一些在C++中非常有意义的涉及搬到Html5平台后却使得Cocos2d-html5变得臃肿.所以在3.0版中,我们决定将一些API改造成更适合JavaScript开发者的API.这篇文档中将要展示的是单例类的改造. 拿cc.SpriteFrameCache为例: /

【Scala】单例对象与伴生对象

Scala的单例对象 Scala不能定义静态成员,而是代之定义单例对象(singleton object).以object关键字定义. 对象定义了某个类的单个实例,包含了你想要的特性: object Accounts{ private var lastNumber = 0 def newUniqueNumber() = { lastNumber += 1; lastNumber} } 当你在应用程序中需要一个新的唯一账号时,调用Account.newUniqueNumber()即可. 对象的构造

不允许在单例对象中创建Srping容器

spring.net在使用的时候,不允许在单例对象中创建Srping容器 需要将实例化模式转为单例singleton=“false”

JS单例对象与构造函数对象的区别

JavaScript对象有几种: 内置对象如Global,Math对象等等. 本地对象如Object.Function.Array.String.Boolean.Number.Date.RegExp.Error.EvalError.RangeError.ReferenceError.SyntaxError.TypeError.URIError. 然而这跟要说的内容并没有什么关系,正题:曾经(此秒之前)纠结过json对象和构造函数对象有什么关系,区别是什么,该怎么合理使用,今天心情...仔细思考探