我记得在学习阶段的某个特定时间,我曾在 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];
我做的有什么不对/对的吗?任何对正确方向的评论将不胜感激。谢谢:)
最佳答案
你做的事很臭,但你做事的方式很好(几乎 - 见下文)......
基本上在不可避免的情况下,您需要存储全局状态...
你应该尽可能地避免它们......这是我的漫谈:
如果您保持的状态是真正全局的并且不经常访问,则使用 NSUserDefaults
将它们存储在用户默认值中:
[[NSUserDefaults standardUserDefaults] setObject:@"123456789" forKey:@"apiKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
如果您的状态不是真正的“全局”状态,那么您应该尝试找到正确的上下文,即使它是人为的:
@interface EncryptionContext: NSObject
@property int someProperty
@end
你做的很好,我更喜欢它而不是单例......基本上你可以用单例做的任何事情你都可以用 +[Class classMethod]
甚至 nakedCFunction()
在多线程应用程序中,请务必@synchronize
您的访问器和 setter ,以便它们始终处于一致的状态。
在引用计数代码中,您将希望保留新对象并释放旧对象...
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
关于ios - 关于 iOS 中全局变量的替代方法(使用类方法和变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17991305/