关于iOS中的全局变量的替代方法(使用类方法和变量)

时间:2013-08-01 10:20:13

标签: ios objective-c model singleton

我记得在学习阶段的某个特定时刻,我已经在iOS中实现了“全局”变量的概念,可以在整个应用程序的任何类中访问。我通过Matt Galloway阅读了许多这样的优秀教程。

我刚刚完成了我最终实现的代码,并且我意识到我的完成方式与任何这些教程完全不同。我想知道我采用的方法可能存在的缺点/优点

我的文件类似于:

@interface GlobalVariables : NSObject

+(void)setUsername:(NSString *)string;
+(NSString *)getUsername;

@end

我的m文件是:

static NSString *name;

@implementation GlobalVariables

+(void)setUsername:(NSString *)string{
    name = string;
}
+(NSString *)getUsername{
    return name;
}

@end

我将全局变量设置在任何其他类中,如

[GlobalVariables setUsername:@"user1"];

并在其他课程中获取

self.nameLabel.text = [GlobalVariables getUsername];

我做了什么有什么不对吗?任何对正确方向的评论都将非常感激。谢谢:))

1 个答案:

答案 0 :(得分:2)

你在做什么是臭,但你是怎么做的很好(几乎 - 见下文)......

基本上存在不可避免的情况,你需要存储全局状态......

你应该尽可能地努力避免它们......这是我的谣言:

如果您保留的状态是真正全局且不经常访问的,请使用NSUserDefaults将其存储在用户默认值中:

[[NSUserDefaults standardUserDefaults] setObject:@"123456789" forKey:@"apiKey"];
[[NSUserDefaults standardUserDefaults] synchronize];

如果你的州不是真正的“全球性”,那么你应该尝试找到正确的语境,即使它是一个人为的语境:

@interface EncryptionContext: NSObject
    @property int someProperty
@end

你正在做的事情很好,而且我更喜欢单身人士......基本上你可以用一个单身人士来做任何事情你可以用+[Class classMethod]甚至一个nakedCFunction()

在多线程应用中,请确保@synchronize您的访问者和设置者,以便他们始终处于一致状态。

在引用计数代码中,您需要保留新对象并释放旧对象...

static NSString *name;

@implementation GlobalVariables

+(void)setUsername:(NSString *)string{

    id tmp = name;
    name = [string copy];
    [tmp release];
}
+(NSString *)getUsername{
    return name;
    //or for more atomic operation [[name copy] autorelease]
}

@end