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

标签 ios objective-c model singleton

我记得在学习阶段的某个特定时间,我曾在 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/

相关文章:

ios - 同时移动2个物体

objective-c - 一周的开始日期是否存储在 NSLocale 的某处?

java - Spring 表单未将数据填充到模型对象

asp.net-mvc - 从传递给局部 View 的嵌套复杂对象中获取值

model - 在\Phalcon\Mvc\Model 中定义源表的最正确方法是什么?

iOS:网络操作后从函数返回值

c# - MonoTouch - UIView.Animate 完成回调未在按钮 touchUpInside 委托(delegate)内调用

ios - iOS (iPad) 中一个页面上的多个 HTML5 媒体元素

ios - 在这里我无法显示从json解析得到的数据?

ios - 逐帧解码 h264 示例 ios 7