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];
4

1 回答 1

1

好吧,如果你想在全局范围内使用你的颜色属性,那么调用allocand一直都是浪费的。init这就是单例提供帮助的地方,因为您只创建一次 ( alloc+ init),而不是在代码中的任何位置使用它。

在您的情况下alloc,每次您想阅读时都会调用myColor它,考虑到您将在整个代码中使用它,这很浪费。

这看起来更干净:

cell.backgroundColor = [[Global sharedInstance] myColor];
于 2012-04-17T16:57:10.550 回答