Objective-C 对象进阶:Objective-C 中单例的概念和使用

 基本概念:

      一个类始终只有一个实例。

 

 创建单例设计模式的基本步骤

     1> 声明一个单件对象的静态实例,并初始化为nil

     2> 创建一个类的工厂方法,生成一个该类的实例,当且仅当这个类的实例为nil时。

     3> 覆盖 allocWithZone:类方法,确保用户在直接分配和初始化对象时,不会产生另一个对象。

     4> 实现 NScopying 协议、覆盖 releaseautoreleaseretainretainCount方法,以此确保单例的状态。

        注意:如果在 ARC模式下,除了覆盖 NScopying协议中的函数其它都不需要覆盖。

     5> 在多线的环境中,注意使用 @synchronized关键字,确保静态实例被正确的创建和初始化。

 

 单例的基本实现

 

 // 定义静态对象和工厂方法

 static File *shareFile = nil;

 

 + (File *)shareFile

 {

     @synchronized (self) { // 线程保护

         // 如果实例为nil,则创建该实例

         if (shareFile == nil)

         {

            shareFile = [[self alloc] init];

         }

     }

     return shareFile;

 }

 

 // 覆盖 allocWithZone 类方法

 + (id)allocWithZone(NSZone *)zone

 {

     @synchronized (self) {

         if (shareFile == nil)

         {

             shareFile = [super allocWithZone:zone];

             return shareFile;

         }

     }

     return shareFile;

 }

 

 // 覆盖 copyWithZone: 方法

 - (id)copyWithZone:(NSZone *)zone

 {

     return shareFile;

 }



以下是简单的示例代码:

//

//  UserContext.h

//  sigtonDemo

//

//  Created by harbinxxh on 13-9-5.

//  Copyright (c) 2013 HIT. All rights reserved.

//


#import <Foundation/Foundation.h>


@interface UserContext : NSObject <NSCopying>


+ (id)shareUserContext;


@end


//

//  UserContext.m

//  sigtonDemo

//

//  Created by harbinxxh on 13-9-5.

//  Copyright (c) 2013 HIT. All rights reserved.

//


#import "UserContext.h"


static UserContext *sigtonInstance = nil;


@implementation UserContext


+ (id)shareUserContext

{

    @synchronized (self) { // 线程保护

        

        if (sigtonInstance == nil) {

            sigtonInstance = [[[self class] alloc] init];

        }

    }

    return sigtonInstance;

}


+ (id)allocWithZone:(NSZone *)zone

{

    if (sigtonInstance == nil) {

        sigtonInstance = [super allocWithZone:zone];

    }

    return sigtonInstance;

}


- (id)copyWithZone:(NSZone *)zone

{

    return sigtonInstance;

}


@end


//

//  main.m

//  sigtonDemo

//

//  Created by harbinxxh on 13-9-5.

//  Copyright (c) 2013 HIT. All rights reserved.

//


#import <Foundation/Foundation.h>

#import "UserContext.h"


int main(int argc, const char * argv[])

{


    @autoreleasepool {

        

        UserContext *userContext1 = [UserContext shareUserContext];

        UserContext *userContext2 = [UserContext shareUserContext];

        UserContext *userContext3 = [UserContext shareUserContext];

        UserContext *userContext4 = [UserContext shareUserContext];

        // 返回相同的地址值

        NSLog(@"userContext1:%p", userContext1);

        NSLog(@"userContext1:%p", userContext2);

        NSLog(@"userContext1:%p", userContext3);

        NSLog(@"userContext1:%p", userContext4);

    }

    return 0;

}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值