Objective-C中的单例模式

?单例模式算是设计模式中比较简单的一种吧,设计模式不是只针对某种编程语言,在C++, Java, PHP等其他OOP语言也有设计模式,笔者初接触设计模式是通过《漫谈设计模式》了解的。这本书中是用java写的,个人感觉拜读完这本书以后虽然有不理解的地方但还是收获蛮大的。上面提到依赖注入,控制翻转的时候,没大看懂,当学习到Strut,Spring, Hibernate的东西的时候才略懂略懂。不过在23种设计模式里面单例模式还是算比较好理解的, 那么在OC中又是怎么来表示单例模式的呢?下面会结合着代码,理解一下OC中得单例模式。

?    ?首先得了解什么是单例模式,用大白话说,单例模式就是在程序中这个类只对应着一个实例,这就是单例模式,单例模式一般用全局静态对象来实现。下面我们会建立一个生成单例的类SingletonClass,在实现文件中定义各种方法来实现我们的单例模式。

?    ?1.单例模式一般用全局静态对象来实现,所以我们在SingletonClass.m中定义一个静态全局变量是少不了的


1

2

//定义静态全局变量

static SingletonClass *single = nil;

?    ?2.上面的静态变量是定义在实现文件中的所以是私有的,要想获取该类的实例得有个getInstance方法来获取实例,在给静态变量分配内存空间之前首先要判断是否已经分配过啦,确保单例,如果分配过了就不分配了。


1

2

3

4

5

6

7

8

9

//获取静态全局对象

+(id)getInstance

{

    //如果没有生成对象,则为静态全局变量分配内存

    if (single == nil) {

        single = [[SingletonClass alloc] init];

    }

    return single;

}

?    ?

?    ?3.为了防止用户通过alloc和new来实例化对象,因此我们要对类方法allcoWithZone进行重写


1

2

3

4

5

6

7

8

//防止通过alloc或者new来创建新的对象我们要重写allocWithZone

+(id)allocWithZone:(NSZone *)zone

{

    if (single == nil) {

        single = [[super allocWithZone:zone] init];

    }

    return single;

}

?    ?4.为了防止用户把单例进行深浅拷贝,我们需要重写copyWithZone方法和mutableCopyWithZone方法,在重写方法之前我们的单例类必须遵循协议NSCoping和NSMutableCoping协议

?    ?遵循协议代码如下:


1

2

3

4

5

6

7

8

9

@interface SingletonClass : NSObject<NSCopying, NSMutableCopying>

//单例中获取单例对象的方法

+(id) getInstance;

//单例测试方法

-(void) singletonFunction;

@end

?    ?重写copyWithZone方法


1

2

3

4

5

//为了防止通过copy来创建新的实例我们要重写copyWithZone;

-(id)copyWithZone:(NSZone *)zone

{

    return self;

}

?    ?重写mutableCopyWithZone方法


1

2

3

4

-(id)mutableCopyWithZone:(NSZone *)zone

{

    return self;

}

?5.防止用户把创建的单例dealloc,我们需要重写retainCount方法


1

2

3

4

5

//重写retainCount方法,防止被dealloc,返回最大值

-(NSUInteger) retainCount

{

    return NSUIntegerMax;

}

?6. 重写release,autorelease, retain方法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//重写retain,引用计数不变

-(id) retain

{

    return self;

}

//重写release

-(oneway void) release

{

}

//重写autorelease

-(id) autorelease

{

    return self;

}

?至此我们的单例模式基本创建完毕,下面开始我们的测试吧;

?在main函数中的代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

//单例模式的测试

SingletonClass *single1 = [SingletonClass getInstance];

SingletonClass *single2 = [SingletonClass new];

SingletonClass *single3 = [[SingletonClass alloc] init];

SingletonClass *single4 = [single1 copy];

SingletonClass *single5 = [single1 mutableCopy];

SingletonClass *single6 = [single1 retain];

[single1 release];

[single1 singletonFunction];

NSLog(@"single_retainCount = %lu", single1.retainCount);

//输出地址

NSLog(@"getInstance     single1_P = %p", single1);

NSLog(@"new             single2_P = %p", single2);

NSLog(@"allo            single3_P = %p", single3);

NSLog(@"copy            single4_P = %p", single4);

NSLog(@"mutableCopy     single5_P = %p", single5);

NSLog(@"retain          single6_P = %p", single6);

?    ?运行结果如下:


1

2

3

4

5

6

7

8

2014-08-07 16:04:44.207 Memory[20664:303] singleton Ps: 我是单例模式中得测试方法!!

2014-08-07 16:04:44.207 Memory[20664:303] single_retainCount = 18446744073709551615

2014-08-07 16:04:44.207 Memory[20664:303] getInstance     single1_P = 0x100204690

2014-08-07 16:04:44.208 Memory[20664:303] new             single2_P = 0x100204690

2014-08-07 16:04:44.208 Memory[20664:303] alloC            single3_P = 0x100204690

2014-08-07 16:04:44.208 Memory[20664:303] copy            single4_P = 0x100204690

2014-08-07 16:04:44.209 Memory[20664:303] mutableCopy     single5_P = 0x100204690

2014-08-07 16:04:44.209 Memory[20664:303] retain          single6_P = 0x100204690

?    ?    ?单例的地址是不变的。

    上面是在非ARC模式下得单例模式,那么在ARC模式下我们应如何实现我们的单例模式呢,我们下面就会给出ARC下的单例模式,用下面的方法,因没有重写alloc,copy等方法,通过alloc还是可以给该对象分配一个新对象的,上面是线程不安全的,下面是线程安全的:

1 + (id)sharedSingleton {
2     static MySingleton *sharedSingleton = nil;
3     static dispatch_once_t onceToken;
4     dispatch_once(&onceToken, ^{
5         sharedSingleton = [[self alloc] init];
6     });
7     return sharedSingleton;
8 }
时间: 2024-10-29 19:08:33

Objective-C中的单例模式的相关文章

“只生一个娃”--设计模式中的单例模式

"只生一个娃"–设计模式中的单例模式(Singleton) 引言 ??被人问到什么是单例模式,突然回答不上来,似乎印象不深了.回去补了一下功课,突然明白了,原来在项目中一直使用的日志模块即采用了单例模式,只是熟视无睹,没有意识到罢了. ??所谓单例模式(Singleton),即指一个类只有一个实例(Instance),并给外界提供访问该实例的一个全局访问点. ??通常我们可以使用全局变量的方式来实现"只生一个娃",但更好的方法就是:让该类自身负责创建和保存它的唯一实

JAVA中的单例模式(采用单例模式定义的类)(转)

1     单例(Singleton)模式:单例模式确保某一个类只有一个 实例,而且该类只能是自己 实例化自己并向其他类公开 这个实例的对象创建 模式 采用单例模式的类:根据单例模式知道其要满足以下三点 1. 确保某一个类只有一个实例 2. 而且自己实例化 3. 并向其他类提供这个实例类 . 2    确保以上三点的所采用的编程策略     * 把构造方法声明为Private.确保只能由自己创建,避免外部创建实例或者被子类继承从而创造额外实例:    * 定义一个私有静态的该类的实例作为该类的数

iOS中的单例模式

单例模式的优点: 由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建.销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显了. 由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置.产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决. 单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作. 单例模式可以在

C# 中实现单例模式

文章目录 简介 不安全线程的单例模式 简单安全线程带锁 双重检查 - 带锁 安全初始化 安全并且懒汉式静态初始化 带泛型的懒汉式单例 异常 提高效率 总结 简介 单例模式是软件工程中广为人知的设计模式.单例模式就是指一个永远只能实例化一次.使用的方式是调用类里创建的静态方法.通常来说,单例模式创建的类,都是不带形参的 ,原因就是当创建多个实例的时候,如果参数不同的话(比如2个不同的重载构造函数),那么就会造成一些不必要的问题(如果相同的实例要被创建而且他们使用相同的参数的话,那么建议使用工厂模式

objective C中的字符串(三)

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *

java中的单例模式与静态类

单例模式与静态类(一个类,所有方法为静态方法)是另一个非常有趣的问题,在<Java中有关单例模式的面试问题>博文中露掉了,由于单例模式和静态类都具有良好的访问性,它们之间有许多相似之处,例如,两者可以直接使用而无须创建对象,都可提交唯一实例,在一个非常高的高度上看起来它们都为是用于同样的任务.由于它们具有较多的相似性,面试官常常会问一些类似为神马使用单例模式替换静态方法?你能使用静态类替换单例模式吗?Java中单例模式与静态的区别有那些?等这样的问题,为回答这些问题,记住他们单例模式和静态方法

Java中的单例模式

Java中的单例模式分为两种:懒汉模式和饿汉模式 懒汉模式代码: 类加载快,在运行时获取对象进度慢 private static Student stu; //创建一个私有的静态学生类对象 private Student(){} //把构造数改成私有的 //单线程 /* public static Student getInstance(){ if(stu==null) // 为空就new一个空间 { stu=new Student(); } return stu; }*/ //双线程 publ

在ios中使用单例模式编程

本文转载至 http://blog.csdn.net/remote_roamer/article/details/7107007 1.    @implementation Singleton    2.         3.    + (Singleton *)instance  {    4.            static Singleton *instance;    5.               6.            @synchronized(self) {    7.

C++中的单例模式

最近遇到几道类似的笔试题: 1. 请实现一个单例模式的类,要求线程安全. 2. 用C++设计一个不能被继承的类. 3. 如何定义一个只能在堆上(栈上)生成对象的类? 这些题目本质上都跟单例模式相关. 单例模式 单例模式就是保证一个类只有一个实例,并提供一个访问它的全局访问点.首先,需要保证一个类只有一个实例:在类中,要构造一个实例,就必须调用类的构造函数,如此,为了防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为protected或private:最后,需要提供要给全局访问点