说到单例,在java学习07-单例设计模式已经说的很清楚,Object-C也是一门面向对象的语言,于是除了写法不同,其他都是大同小异.
---未来会出一套 "设计模式"学习的笔记
原则:
(1) 不能直接调用构造方法---私有
(2)对象内存只能初始化一次---static
(3)使用其他静态接口(方法)把静态的对象返回
废话少说了,让我们直接上程序吧.
//
// People.h
// Single
// DRAGON
// Created by 5016 on 13-12-2.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface People : NSObject<NScopying>
//定义静态方法
+(People *)getInstance;
@end
//
// People.m
// Single
// DRAGON
// Created by 5016 on 13-12-2.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "People.h"
@implementation People
static People *single = nil;
+(People *)getInstance
{
@synchronized(self)//线程锁,可以不使用,使用之后使线程安全,但是执行速率下降
{
if (!single) {
single = [[[self class] alloc]init];
}
}
return single;
}
#pragma mark 下面方法确保只有一个实例
//当调用alloc
+(id)allocWithZone:(NSZone *)zone
{
if (!single) {
single = [super allocWithZone:zone];
}
return single;
}
//覆盖copy协议
-(id)copyWithZone:(NSZone *)zone
{
return single;
}
-(id)retain
{
return single;
}
-(oneway void)release
{
}
-(id)autorelease
{
return single;
}
-(NSUInteger)retainCount
{
return UINT_MAX;//返回一个>0的值
}
-(void)dealloc
{
[super dealloc];
}
@end
//
// main.m
// Single
// DRAGON
// Created by 5016 on 13-12-2.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "People.h"
int main(int argc, const char * argv[])
{
People* person1 = [People getInstance];
People* person2 = [People getInstance];
//判断是否为同一对象堆内存空间
if (person1 == person2) {
NSLog(@"true");//当然是打印true
}else{
NSLog(@"false");
}
return 0;
}
笔者认为单例不需要使用同步,静态区是一个独立的内存块,静态修饰的变量或方法随着类的加载而加载,只初始化一次,优先与对象的存在,就算启动多个线程,也不可能再初始化静态对象,使用同步会使系统内部增加判断,负载增加,程序执行降低效率….
但是,有时候同步是必要的,详细可以去看同步控制单例,http://www.ibm.com/developerworks/cn/java/l-singleton/