Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何定义可以在应用程序中的任何位置访问的全局变量?_Iphone_Objective C_Variables_Global - Fatal编程技术网

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

Iphone 如何定义可以在应用程序中的任何位置访问的全局变量?,iphone,objective-c,variables,global,Iphone,Objective C,Variables,Global,可能重复: 我想创建一个全局变量。 我想在任何地方访问此变量 Java等价物: static var score:int = 0; 例如,如果我在Game类中定义了一个全局变量。 如何访问此全局变量 Game.score ? Objective-C不直接支持“类变量”。相反,您可以创建一个对类文件的作用域有效的变量,并使用类方法访问它 // outside the implementation static int score = 0; // static means it is only

可能重复:

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

Java等价物:

static var score:int = 0;
例如,如果我在Game类中定义了一个全局变量。 如何访问此全局变量

Game.score ?

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;
}

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


编辑:重新阅读您的问题,看起来我误解了您的问题,ughoavgfhw的答案可能就是您想要的答案。他是正确的,Objective-C中没有类变量,因此您必须创建一个常规的C静态变量,然后创建类方法(用
+
而不是
-
表示)来设置和获取


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

如果应用程序中有多个视图,并且希望每个视图都能访问一个变量,则应始终创建一个模型/数据类并在其中定义变量。大概是这样的:

目标-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";  
每个视图控制器都可以访问此变量。您只需创建数据类的实例

Swift:

class DataClass {

    private var str: String!

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

使用
发送一次

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

谢谢这帮助我摆脱了警告
没有找到名为sharedInstance的静态getter方法,返回类型默认为id
简单但功能强大你让我的周末:)如何从其他类访问该属性?你总能获得对app委托的引用如下所示:
(YourAppDelegateClass*)[UIApplication sharedApplication].delegate
。我在app delegate头中放了一个#define宏,或者使用一个class方法,这样我可以以更干净的方式访问它,但你不必这样做。此外,如果你发现自己在app delegate中放了很多东西,你可能应该重新考虑你的方法,但如果真的需要的话,您可能想考虑为此创建单独的单级类,或者考虑在应用程序委托中使用引用的常规类。谢谢@ EnStInx2!没错!我现在意识到我应该在这个应用程序中有一个模型类,但是考虑到这是(希望)最后一个解决方法,我将把这一课保存到下一个应用程序中
是否在
@synchronized
块中?在NSManagedObject子类中,如果无法编辑init方法,并且没有viewDidLoad可将其放入其中,您将如何获得这些变量?对于singleton,最首选dispatch_once()。请参阅Wonderful上的讨论。可行的、甜美的、有用的代码!:)这可以被认为是单例模式吗?下面链接上的答案解释得很清楚