Как определить глобальную переменную, к которой можно получить доступ в любом месте моего приложения?

Возможный дубликат:
Глобальная цель переменной int c

Я хотел бы создать глобальную переменную. Я хочу получить доступ к этой переменной в любом месте.

Эквивалент Java:

static var score:int = 0;

Например, если я определяю глобальные переменные в классе Game. Как получить доступ к этой глобальной переменной?

Game.score ?

person Benoît Freslon    schedule 19.05.2011    source источник
comment
Ответ по следующей ссылке ясно объясняет stackoverflow.com/a/20423815/730807   -  person Durai Amuthan.H    schedule 28.06.2014


Ответы (3)


Если у вас есть несколько представлений в вашем приложении, и в этом случае вы хотите иметь переменную, доступную для каждого представления, вы всегда должны создавать класс Model/Data и определять переменную в нем. Что-то вроде этого :

Цель-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";  

Эта переменная будет доступна для каждого контроллера представления. Вам просто нужно создать экземпляр класса данных.

Свифт:

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

person Nitish    schedule 20.05.2011
comment
Должна ли эта строка return instance; находиться внутри блока @synchronized? - person Basil Bourque; 15.05.2013
comment
как бы вы получили эти переменные в подклассе NSManagedObject, где вы не можете редактировать метод инициализации, и у него нет viewDidLoad для его добавления? - person Conflagrationator; 06.06.2013
comment
dispatch_once() наиболее предпочтителен для синглтона. См. обсуждение на stackoverflow.com/a/20423815/730807 - person Durai Amuthan.H; 26.12.2013
comment
Замечательно. Работающий, приятный и полезный код! :) - person Vyacheslav; 29.03.2014
comment
Можно ли это считать шаблоном Singleton? - person nr5; 03.07.2014
comment
У меня была проблема с этим. Когда я закрываю приложение. Эти переменные данные становятся нулевыми. Любое решение ??? - person Rushi trivedi; 29.08.2014
comment
Большое спасибо! Кстати, вы должны использовать #import DataClass.h везде, где вам нужно получить доступ к глобальной переменной. - person Fiach Reid; 11.11.2014
comment
Это работает для UIImages? Я попытался сделать именно то, что было опубликовано для NSString, но я не мог понять, как заставить его работать с изображением. - person Will Von Ullrich; 23.06.2015

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;
}
person ughoavgfhw    schedule 19.05.2011
comment
Спасибо, это помогло мне избавиться от предупреждения no static getter method named sharedInstance found return type default to id - person thesummersign; 26.04.2012
comment
Простой и мощный - person Victor; 08.09.2014
comment
Вы сделали мои выходные :) - person Abhishek Thapliyal; 24.03.2017

Предпочтительный способ реализации глобальных переменных в проекте iOS (хотя это и не настоящие глобальные переменные) — создать свойство в делегате приложения, а затем просто получить доступ к этому свойству из каждого из ваших классов.


РЕДАКТИРОВАТЬ: Перечитывая ваш вопрос, похоже, я неправильно истолковал ваш вопрос, и ответ ughoavgfhw, вероятно, то, что вы ищете. Он прав, в Objective-C нет такой вещи, как переменная класса, поэтому вам нужно создать обычную статическую переменную C, а затем создать методы класса (обозначаемые +, а не -) для установки и получения.

Хотя обычно, когда мне нужны «глобальные» переменные в приложении, я создаю одноэлементные классы для их размещения и связанных с ними методов (чтобы делегат приложения не переполнялся несвязанными свойствами), или, если это меньший проект, я просто использую приложение делегат (который также является одноэлементным классом), а не отдельные синглетоны. Хотя нет ничего плохого в подходе статической переменной плюс установщика/получателя класса, если это лучше подходит для ваших нужд.

person Ben Baron    schedule 19.05.2011
comment
Как получить доступ к этому свойству из других классов? - person Tony Adams; 10.01.2013
comment
Вы всегда можете получить ссылку на делегат приложения следующим образом: (YourAppDelegateClass *)[UIApplication sharedApplication].delegate. Я добавляю макрос #define в заголовок делегата приложения или использую метод класса, чтобы получить к нему более понятный доступ, но вам это не обязательно. - person Ben Baron; 10.01.2013
comment
Кроме того, если вы обнаружите, что помещаете много вещей в делегат приложения, вам, вероятно, следует переосмыслить свой подход, но если это действительно необходимо, вы можете рассмотреть возможность создания отдельного класса singleton для этого или обычный класс с ссылка в вашем делегате приложения. - person Ben Baron; 10.01.2013
comment
Спасибо @einsteinx2! Да, точно! Теперь я понимаю, что у меня должен быть класс модели в этом приложении, но, учитывая, что это (надеюсь) последний обходной путь, я сохраню этот урок для следующего приложения. - person Tony Adams; 10.01.2013