Singleton en Objective-c

Uno de los patrones de diseño mas utilizados es el singleton. El singleton es usado para instanciar solo una vez una clase. Encontre un template para un singleton en objective-c el cual quiero compartir con ustedes.

Pero para este caso usare un singleton para guardar/retener un valor de tipo NSString

A continuación pongo el código para el singleton.

MySingleton.h

#import <Foundation/Foundation.h>

@interface MySingleton : NSObject {

    NSString *stringValue;

}

+ (MySingleton *)sharedMySingleton;

- (NSString *)stringValue;
- (void)setStringValue:(NSString *)value;

@end

MySingleton.m

#import "MySingleton.h"

@implementation MySingleton

static MySingleton* _sharedMySingleton = nil;

+(MySingleton*)sharedMySingleton
{
	@synchronized([MySingleton class])
	{
		if (!_sharedMySingleton)
			[[self alloc] init];

		return _sharedMySingleton;
	}

	return nil;
}

+(id)alloc
{
	@synchronized([MySingleton class])
	{
		NSAssert(_sharedMySingleton == nil, @"Attempted to allocate a second instance of a singleton.");
		_sharedMySingleton = [super alloc];
		return _sharedMySingleton;
	}

	return nil;
}

-(id)init {
	self = [super init];
	if (self != nil) {
		// initialize stuff here
        stringValue = nil;
	}

	return self;
}

- (NSString *)stringValue{
    return stringValue;
}
- (void)setStringValue:(NSString *)value{
    stringValue = value;
}

@end

Si quieres Guardar(Set) el stringValue, usamos lo siguiente:

[[MySingleton sharedMySingleton] setStringValue:@"Hello World"];

Y si quieres obtener(Get) el stringValue, usamos lo siguiente:

[[MySingleton sharedMySingleton] stringValue];

Puedes descargar una copia de un código funcional de github

Fuente del Post : getsetgames

2 thoughts on “Singleton en Objective-c

  1. Prefiero esta implementacion:

    static MySingleton *_sharedMySingleton=nil;
    -(id)init{
    if (_sharedMySingleton!=nil)return self;
    if (self=[super init]) {
    NSLog(@”%@”,NSStringFromClass([self class]));
    }
    return self;
    }

    + (MySingleton *)initialize{
    @synchronized([MySingleton class])
    {
    if(!_sharedMySingleton)
    _sharedMySingleton = [[super allocWithZone:NULL] init];
    return _sharedMySingleton;
    }
    return nil;
    }

    + (id)allocWithZone:(NSZone *)zone
    {
    @synchronized([MySingleton class])
    {
    return [[self initialize] retain];
    }
    return nil;
    }
    - (id)copyWithZone:(NSZone *)zone
    {
    return self;
    }
    - (id)retain
    {
    return self;
    }
    - (NSUInteger)retainCount
    {
    return NSUIntegerMax; //denotes an object that cannot be released
    }
    - (oneway void)release
    {
    //do nothing
    }
    - (id)autorelease
    {
    return self;
    }

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>