3

我记得在我学习阶段的某个特定时间,我一直在努力在 iOS 中实现“全局”变量的概念,这些变量可以在整个应用程序的任何类上访问。我通读了许多优秀的教程,比如Matt Galloway的这篇教程。

我刚刚浏览了我最终实现的代码,我意识到我以与这些教程中的任何一个都非常不同的方式完成了它。我想知道我采用的方法可能存在的缺点/优点

我的 h 文件类似于:

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

我所做的有什么错/对吗?任何对正确方向的评论将不胜感激。谢谢 :)

4

1 回答 1

2

你正在做的事情很臭,但你做的很好(几乎 - 见下文)......

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

你应该尽量避免它们......这是我的漫谈:

如果您保留的状态是真正的全局且不经常访问,则使用以下命令将它们存储在用户默认值中NSUserDefaults

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

如果您的状态不是真正的“全球”,那么您应该尝试找到正确的上下文,即使它是人为的:

@interface EncryptionContext: NSObject
    @property int someProperty
@end

你所做的很好,我更喜欢它而不是单例......基本上你可以用单例做的任何事情,你可以用 a+[Class classMethod]甚至 anakedCFunction()

在多线程应用程序中,请确保@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
于 2013-08-01T17:09:49.367 回答