Singletons in Objective-C

來源:互聯網
上載者:User
Background

Singletons classes are an important concept to understand because they exhibit an extremtely useful design pattern.

This idea is used throughout the iPhone SDK, for example, UIApplication has a method called sharedApplication which when called from anywhere will return the UIApplication instance which relates to the currently running application.

How to implement

You can implement a singleton class in Objective-C using the following code:

MyManager.h

1234567891011
#import <foundation/Foundation.h>@interface MyManager : NSObject {    NSString *someProperty;}@property (nonatomic, retain) NSString *someProperty;+ (id)sharedManager;@end

MyManager.m

1234567891011121314151617181920212223242526272829
#import "MyManager.h"@implementation MyManager@synthesize someProperty;#pragma mark 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 just here for clarity really.}@end

What this does is it defines a static variable (but only global to this translation unit)) called sharedMyManager which is then initialised once and only once in sharedManager. The way we ensure that it’s only created once is by using the dispatch_once method from Grand Central Dispatch (GCD). This is thread safe and handled entirely by the OS for you so that you don’t have to worry about it at all.

However, if you would rather not use GCD then you should use the following code for sharedManager:

Non-GCD based code

1234567
+ (id)sharedManager {    @synchronized(self) {        if (sharedMyManager == nil)            sharedMyManager = [[self alloc] init];    }    return sharedMyManager;}

Then you can reference the singleton from anywhere by calling the following function:

MyManager *sharedManager = [MyManager sharedManager];

I’ve used this extensively throughout my code for things such as creating a singleton to handle CoreLocation or CoreData functions.

Non-ARC code

Not that I recommend it, but if you are not using Automatic Reference Counting (ARC), then you should use the following code:

MyManager.h non-ARC

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
#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 an object that cannot be released}- (oneway void)release {  // never release}- (id)autorelease {  return self;}- (id)init {  if (self = [super init]) {      someProperty = [[NSString alloc] initWithString:@"Default Property Value"];  }  return self;}- (void)dealloc {  // Should never be called, but just here for clarity really.  [someProperty release];  [super dealloc];}@end

1) How do I implement an Objective-C singleton that is compatible with ARC?

2) Singletons in Objective-C

3) iOS | How - To Share Data Between View Controllers using a Singleton

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.