如何定义可以在我的应用程序中的任何位置访问的全局变量?

Ben*_*lon 32 iphone variables global objective-c

可能重复:
全局int变量目标c

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

Java等价物:

static var score:int = 0;
Run Code Online (Sandbox Code Playgroud)

例如,如果我将全局变量定义到Game类中.如何访问这个全局变量?

Game.score ?
Run Code Online (Sandbox Code Playgroud)

Nit*_*ish 94

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

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;    
}    
Run Code Online (Sandbox Code Playgroud)

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

DataClass *obj=[DataClass getInstance];  
obj.str= @"I am Global variable";  
Run Code Online (Sandbox Code Playgroud)

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

斯威夫特:

class DataClass {

    private var str: String!

    class var sharedManager: DataClass {
        struct Static {
            static let instance = DataClass()
        }
        return Static.instance
    }
}
Run Code Online (Sandbox Code Playgroud)

用法: 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!
    }
}  
Run Code Online (Sandbox Code Playgroud)

用法: DataClass.sharedManager.str

  • dispatch_once()最适合单身人士.请参阅http://stackoverflow.com/a/20423815/730807上的讨论 (2认同)
  • Wondereful.可行,甜蜜和有用的代码!:) (2认同)

ugh*_*fhw 20

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;
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*ron 7

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


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

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

  • 您总是可以像这样获得对app委托的引用:`(YourAppDelegateClass*)[UIApplication sharedApplication] .delegate`.我在应用程序委托标头中放置了一个#define宏,或者使用类方法,以便我可以更清晰地访问它,但您不必这样做. (5认同)
  • 另外,如果你发现自己在app delegate中添加了很多东西,那么你应该重新考虑你的方法,但如果确实需要,你可能要考虑为此创建一个单独的单例类,或者为常规类创建一个您的应用代表中的引用. (2认同)