【问题标题】:How to define a global variable that can be accessed anywhere in my application? [duplicate]如何定义可以在我的应用程序中的任何位置访问的全局变量? [复制]
【发布时间】:2011-05-19 23:29:05
【问题描述】:

可能重复:
Global int variable objective c

我想创建一个全局变量。 我想在任何地方访问这个变量。

Java 等价物:

static var score:int = 0;

例如,如果我在 Game 类中定义了一个全局变量。 如何访问这个全局变量?

Game.score ?

【问题讨论】:

标签: iphone objective-c variables global


【解决方案1】:

如果您的应用程序中有多个视图,并且在这种情况下您希望每个视图都可以访问一个变量,那么您应该始终创建一个模型/数据类并在其中定义变量。像这样的东西:

Objective-C:

//DataClass.h      
@interface DataClass : NSObject {    

    NSString *str;
}

@property(nonatomic,retain)NSString *str;    
+(DataClass*)getInstance;    
@end  


//DataClass.m    
@implementation DataClass    
@synthesize str;

static DataClass *instance = nil;

+(DataClass *)getInstance
{    
    @synchronized(self)    
    {    
        if(instance==nil)    
        {    
            instance= [DataClass new];    
        }    
    }    
    return instance;    
}    

现在在您的视图控制器中,您需要将此方法称为:

DataClass *obj=[DataClass getInstance];  
obj.str= @"I am Global variable";  

每个视图控制器都可以访问此变量。您只需要创建一个 Data 类的实例。

斯威夫特:

class DataClass {

    private var str: String!

    class var sharedManager: DataClass {
        struct Static {
            static let instance = DataClass()
        }
        return Static.instance
    }
}

用法:DataClass.sharedManager.str

使用dispatch_once

class DataClass {

    private var str: String!

    class var sharedInstance: DataClass {
        struct Static {
            static var onceToken: dispatch_once_t = 0
            static var instance: DataClass? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = DataClass()
        }
        return Static.instance!
    }
}  

用法:DataClass.sharedManager.str

【讨论】:

  • 该行 return instance; 是否应该在 @synchronized 块内?
  • 如何在无法编辑 init 方法且没有 viewDidLoad 可放入的 NSManagedObject 子类中获取这些变量?
  • dispatch_once() 最适合单身人士。请参阅stackoverflow.com/a/20423815/730807的讨论
  • 太棒了。可行的,甜蜜的和有用的代码!:)
  • 这可以被认为是单例模式吗?
【解决方案2】:

Objective-C 不直接支持“类变量”。相反,您可以创建一个在类文件范围内有效的变量,并使用类方法访问它。

// outside the implementation
static int score = 0; // static means it is only accessible from the current file

@implementation Game

+ (int)score {
    return score;
}
+ (void)setScore:(int)newScore {
    score = newScore;
}

【讨论】:

  • 谢谢你这帮助我摆脱了警告no static getter method named sharedInstance found return type default to id
  • 简单而强大
  • 你度过了我的周末 :)
【解决方案3】:

在 iOS 项目中实现全局变量(尽管这些不是真正的全局变量)的首选方法是在应用程序委托中创建一个属性,然后从您的每个类中访问该属性。


编辑:重新阅读您的问题,看来我误解了您的问题,而 ughoavgfhw 的答案可能正是您要找的。他是对的,Objective-C 中没有类变量这样的东西,所以你必须创建一个常规的 C 静态变量,然后创建类方法(由 + 而不是 - 表示)用于设置和获取.

虽然一般来说,当我在应用程序中需要“全局”变量时,我会创建单例类来容纳它们及其相关方法(因此应用程序委托不会溢出不相关的属性),或者如果它是一个较小的项目,我只是使用应用程序委托(也是一个单例类)而不是单独的单例。尽管静态变量加上类 setter/getter 方法没有任何问题,如果它更适合您的需求。

【讨论】:

  • 如何从其他类访问该属性?
  • 您始终可以像这样获取对应用委托的引用:(YourAppDelegateClass *)[UIApplication sharedApplication].delegate。我在应用程序委托标头中放置了一个#define 宏或使用类方法,以便我可以以更简洁的方式访问它,但您不必这样做。
  • 另外,如果您发现自己在应用程序委托中放置了很多东西,那么您可能应该重新考虑您的方法,但如果确实需要,您可能需要考虑创建一个单独的单例类为此,或在您的应用委托中引用的常规类。
  • 谢谢@einsteinx2!对,就是这样!我现在意识到我应该在这个应用程序中有一个模型类,但鉴于这是(希望)这是最后一个解决方法,我会将这一课保存到下一个应用程序中。
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 2019-07-16
  • 2015-10-10
  • 1970-01-01
相关资源
最近更新 更多