OC的单例模式

http://blog.csdn.net/kmyhy/article/details/8715764
原文: http://www.galloway.me.uk/tutorials/singleton-classes/

本人学习写的demo 下载链接 http://download.csdn.net/detail/lengshengren/6474655


在iOS开发中,单例是最有用的设计模式之一。它是在代码间共享数据而不需要手动传递参数的一种最有用的方法。关于单例和其他设计模式,请参考这本书:

《Cocoa design pattern》

背景

单例是一种重要的概念,它是一种极其便利的设计模式。在iPhone SDK中大量使用了单例的概念,例如,UIApplication的sharedApplication方法,任何时候都会返回一个当前应用程序的UIApplication实例。

将如何实现

使用下列代码实现一个单例类:

MyManager.h

#import<foundation/Foundation.h>

 

@interfaceMyManager : NSObject {

    NSString *someProperty;

}

 

@property(nonatomic, retain) NSString *someProperty;

 

+(id)sharedManager;

 

@end

MyManager.m

#import"MyManager.h"

 

@implementationMyManager

 

@synthesizesomeProperty;

 

#pragmamark Singleton Methods

 

+(id)sharedManager {

    static MyManager*sharedMyManager = nil;

    static dispatch_once_t  onceToken;

   dispatch_once(&onceToken, ^{

        sharedMyManager = [[self alloc] init];

    });

    return sharedMyManager;

}

 

-(id)init {

  if (self = [super init]) {

      someProperty =[[NSString alloc] initWithString:@"Default Property Value"];

  }

  return self;

}

 

-(void)dealloc {

  // Should never be called, but justhere for clarity really.

}

 

@end

 

我们定义了一个静态变量叫做sharedMyManager,它在sharedManager方法中只会被实例化一次。通过GCD的dispath_once方法,我们确保sharedMyManager方法只会被创建一次。这是线程安全的,你无需担心什么。

但是,如果你不想用GCG,也可以这样实现sharedManager方法:

非-GCD 代码

+ (id)sharedManager {

    @synchronized(self) {

       if (sharedMyManager == nil)

           sharedMyManager = [[self alloc] init];

    }

    returnsharedMyManager;

}

这样调用单例对象:

MyManager *sharedManager = [MyManager sharedManager];

在我的代码中,很多地方都使用了这样的代码。我用这些单例对象处理CoreLocation或CoreData。

非ARC代码

如果你不使用ARC(不建议),则应该使用下列代码:

MyManager.h (非ARC)

#import "MyManager.h"

 

static MyManager *sharedMyManager = nil;

 

@implementation MyManager

 

@synthesize someProperty;

 

#pragma mark Singleton Methods

+ (id)sharedManager {

  @synchronized(self) {

     if(sharedMyManager == nil)

         sharedMyManager = [[super allocWithZone:NULL] init];

  }

  return sharedMyManager;

}

+ (id)allocWithZone:(NSZone *)zone {

  return [[self sharedManager]retain];

}

- (id)copyWithZone:(NSZone *)zone {

  return self;

}

- (id)retain {

  return self;

}

- (unsigned)retainCount {

  return UINT_MAX; //denotes anobject that cannot be released

}

- (oneway void)release {

  // never release

}

- (id)autorelease {

  return self;

}

- (id)init {

  if (self = [super init]) {

     someProperty = [[NSString alloc] initWithString:@"Default PropertyValue"];

  }

  return self;

}

- (void)dealloc {

  // Should never be called,but just here for clarity really.

  [someProperty release];

  [super dealloc];

}

 

@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值