您的位置:首页 > 移动开发 > Objective-C

Object-C 学习笔记(六)---单例设计模式

2013-12-02 17:10 337 查看
说到单例,在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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: