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

说到单例,在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/


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值