我记得在学习阶段的某个特定时刻,我已经在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];
我做了什么有什么不对吗?任何对正确方向的评论都将非常感激。谢谢:))
答案 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