试图理解具有许多变量的objective-c中的Singleton概念

时间:2013-01-18 19:48:49

标签: objective-c oop design-patterns singleton

我试图在objective-c中理解Singleton概念。

我发现的大多数示例都只引用了一个变量。

关于如何调整示例以处理许多变量,我有点迷失,例如返回x,y,z的加速度计值。

你能引导我一点吗?

1 个答案:

答案 0 :(得分:4)

Singleton 是指一个特殊对象,只能在应用程序的生命周期内存在一次。该对象可以根据需要包含尽可能多的变量和属性。

//  Singleton.h

@interface Singleton : NSObject

@property (readwrite) int propertyA;
@property (readwrite) int propertyB;
@property (readwrite) int propertyC;

+ (Singleton *)sharedInstance;

@end

Singleton 的关键是它只能创建一次。通常在Objective-C中,我们使用@synchronized()指令来确保它只被创建一次。我们将其放在名为sharedInstance的便捷类方法中,并返回 Singleton 。由于Singleton只是一个对象,因此它很容易拥有多个属性,变量和方法。

// Singleton.m

#import "Singleton.h"

@interface Singleton ()
{
    int variableA;
    int variableB;
    int variableC;
}
@end

@implementation Singleton

static Singleton *sharedInstance = nil;

+ (Singleton *)sharedInstance
{
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [[Singleton alloc] init];
        }
    }
    return sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone {
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [super allocWithZone:zone];
            return sharedInstance;
        }
    }
    return nil;
}

- (id)init {
    self = [super init];
    if (self) {
        // Inits
    }
    return self;
}

@end

这不是创建 Singleton 的唯一方法。请记住,重要的是它只能创建一次。因此,在为OSX和iOS开发时,您可以利用较新的Grand Central Dispatch调用,例如dispatch_once

与单身人士交谈

因此,假设您在其他地方与 Singleton 交谈时有另一个对象。这可以在#import "Singleton.h"

的任何地方完成
- (void)someMethod
{
    // Setting properties
    int valueA = 5;
    [[Singleton sharedInstance] setPropertyA:valueA];

    // Reading properties
    int valueB = [[Singleton sharedInstance] propertyB];
}