单例模式与分离类 - 优缺点

3

开始寻找一个全局静态变量,用于在应用程序中的各个地方使用同一种颜色。我无法理解此处 SO 上某些非常好的答案(较老),因此我创建了一个类来简单处理此问题。根据其他线程(中的一些),我决定避免使用应用程序代理。

似乎有几种方法可以处理这个问题。作为一名经验较少的 iOS/Objective-C 开发人员,下面的方法有什么缺点?(顺便说一下,它可以工作,并且看起来很简单。)

// Global.h
@interface Global : NSObject

@property (strong, nonatomic) UIColor *myColor;

- (id)initWithColor:(NSString *)color;

// Global.m
@implementation Global

@synthesize myColor;

- (id)initWithColor:(NSString *)color
{
    if (!self) {
        self = [super init];
    }

    if ([color isEqualToString:@"greenbackground"])
        myColor = [[UIColor alloc] initWithRed:0.0 / 255 green:204.0 / 255 blue:51.0 / 204 alpha:1.0];
    ... and so on with other colors
    return self;
}
@end

稍后使用颜色:

cell.backgroundColor = [[[Global alloc] initWithColor:@"greenbackground"] myColor];

为了更好的解决方案进行编辑:

// Global.h

#import <foundation/Foundation.h>

@interface Global : NSObject {
    UIColor *myGreen;
    UIColor *myRed;
}

@property (nonatomic, retain) UIColor *myGreen;
@property (nonatomic, retain) UIColor *myRed;

+ (id)sharedGlobal;

@end

// Global.m
#import "Global.h"

static Global *sharedMyGlobal = nil;

@implementation Global

@synthesize myGreen;
@synthesize myRed;

#pragma mark Singleton Methods
+ (id)sharedGlobal {
    @synchronized(self) {
        if (sharedMyGlobal == nil)
            sharedMyGlobal = [[self alloc] init];
    }
    return sharedMyGlobal;
}

- (id)init {
    if (self = [super init]) {
        myGreen = [[UIColor alloc] initWithRed:0.0 / 255 green:204.0 / 255 blue:51.0 / 204 alpha:1.0];
        myRed = [[UIColor alloc] initWithRed:204.0 / 255 green:51.0 / 255 blue:51.0 / 204 alpha:1.0];
    }
    return self;
}

@end

并且用法:

cell.comboLabel.textColor = [[Global sharedGlobal] myGreen];
1个回答

1

如果你想要在全局使用颜色属性,那么每次调用allocinit都是浪费的。这时候单例模式就派上用场了,你只需要创建一次(alloc + init),然后在代码中任何需要的地方使用。

在你的情况下,每次想要读取myColor时都会调用alloc,这是很浪费的,因为你将在整个代码中使用它。

这样看起来更加简洁:

cell.backgroundColor = [[Global sharedInstance] myColor];

谢谢指出。那个想法完全忘了。我会再看一下单例模式。 - David
谢谢您的提供。我肯定可以。在这个页面上,MyCommon类的代码看起来很简单而且有用。然而,Xcode会抛出几个我无法解决的错误。另外,我创建了一个名为Global的NSObject简单类,并更改(重命名)了代码以匹配。如果您想查看代码,请建议如何在此处显示它。我正在考虑使用颜色ivars代替用户。(?) - David
同时查看此页面中ARC的最佳解决方案(http://iphone.galloway.me.uk/iphone-sdktutorials/singleton-classes/)。 - David
欢迎您编辑问题并添加相关代码。 - giorashc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接