单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。
例子:
A.h:
#import <Foundation/Foundation.h>
@interface A : NSObject
@property(assign) int b;
+(A*) getA;
-(void) funAdd;
-(void) funClear;
@end
A.m:
#import "A.h"
@implementation A
+(A*)getA
{
// nil和NULL从字面意思来理解比较简单,nil是一个对象,而NULL是一个值,我的理解为nil是将对象设置为空,而NULL是将基本类型设置为空的。而且我们对于nil调用方法,不会产生crash或者抛出异常。
// 看一下用法
// NSURL *url = nil;
// Class class = Nil;
// int *pointerInt = NULL;
// nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空
static A *a;
if (a == Nil) {
//a = [[A alloc] init];
a = [A new];
}
return a;
}
-(void)funClear
{
_b = 0;
}
-(void)funAdd
{
_b++;
NSLog(@"%i",_b);
}
@end
main:
#import <Foundation/Foundation.h>
#import "A.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
for (int i=0; i<10; i++) {
[[A getA] funAdd]; //为什么只能调用一次funAdd?
if (i == 5) {
[[A getA] funClear];
}
}
}
return 0;
}
结果:
2013-07-30 14:42:58.607 2013-7-29作业1[1863:303] 1
2013-07-30 14:42:58.609 2013-7-29作业1[1863:303] 2
2013-07-30 14:42:58.610 2013-7-29作业1[1863:303] 3
2013-07-30 14:42:58.610 2013-7-29作业1[1863:303] 4
2013-07-30 14:42:58.611 2013-7-29作业1[1863:303] 5
2013-07-30 14:42:58.612 2013-7-29作业1[1863:303] 6
2013-07-30 14:42:58.612 2013-7-29作业1[1863:303] 1
2013-07-30 14:42:58.613 2013-7-29作业1[1863:303] 2
2013-07-30 14:42:58.613 2013-7-29作业1[1863:303] 3
2013-07-30 14:42:58.614 2013-7-29作业1[1863:303] 4