Глобальная целая переменная цель c - PullRequest
5 голосов
/ 22 февраля 2011

Я хочу объявить статическую переменную int в одном классе и иметь доступ к ней в любом другом классе. Каков наилучший способ сделать это?

Ответы [ 4 ]

9 голосов
/ 22 февраля 2011

В Objective C. нет статических переменных класса. Вы можете создать ее как статическую переменную области файла в файле реализации класса и предоставить статические методы установки и получения в классе.

Или вы можете сделать его глобальным в старой школе с объявлением extern в файле .h. Первый подход является более гибким - вы можете добавить дополнительные проверки в метод set, например, последний менее набирает текст и избегает накладных расходов на вызов метода.

5 голосов
/ 06 декабря 2013

Вот несколько способов, которыми вы можете попробовать

  • Объявление глобальных переменных в appdelegate

  • Создание одноэлементного класса и помещение туда глобальных переменных.


Использование appdelegate

appdelegate также является разновидностью одноэлементного класса

Определение функции:

-(NSString*)ReadAppDelegateInstanceVariable:(NSString*)InstVar 
{
AppDelegate *appDel=(AppDelegate *)[UIApplication sharedApplication].delegate;
return [appDel valueForKey:InstVar];
}

Вызов функции:

[self ReadAppDelegateInstanceVariable:@"someInstanceVariableName"];

Использование собственного одноэлементного класса

Может существовать только один экземпляр класса.

Пример объявления синглтона:

@interface SigletonClass : NSObject
{
  //declare instance variable
}
+ (id)sharedSingletonClass;
@end

Пример реализации синглтона:

Подход 1: Использование GCD

@implementation SigletonClass

+ (id)sharedSingletonClass {

    static SigletonClass *sharedClass = nil;

    static dispatch_once_t onceToken;//The way we ensure that it’s only created once is by using the dispatch_once method from Grand Central Dispatch (GCD).

   dispatch_once(&onceToken, ^{
     sharedClass = [[self alloc] init];
  });

    return sharedClass;
}

- (id)init {
    if (self = [super init]) {
     //init instance variable        
    }
    return self;
}
@end

Подход 2: Без использования GCD

@implementation SigletonClass

+ (id)sharedSingletonClass {

    static SigletonClass *sharedClass = nil;

    @synchronized(self) {//To safeguard threading issues

        if (sharedClass == nil)
            sharedClass = [[self alloc] init];
    }

    return sharedClass;
}

- (id)init {
    if (self = [super init]) {
     //init instance variable        
    }
    return self;
}
@end

Определение функции:

-(NSString*)ReadSingleTonInstanceVariable:(NSString*)InstVar 
{
   SigletonClass sObj=[SigletonClass sharedSingletonClass];
   return [sObj valueForKey:InstVar];
}

ФункцияЗвонок:

[self ReadSingleTonInstanceVariable:@"SomeInstanceVariableName"];

NSString to int:

-(int)ConvertToIntFromString:(NSString*)str
{
    return str.intValue;
}

Насколько я знаю, с этим не возникает проблем с производительностьюнад другим.

Я всегда предпочитаю синглтон-класс , а не appdelegate , потому что код не будет загроможден, и я считаю чрезмерным использование appdelegate как вонючий код .

2 голосов
/ 22 февраля 2011

Это нарушает некоторые паттерны, я бы не стал его использовать.

В любом случае, если вы объявите свойство в делегате приложения, вы можете позвонить:
[[NSApp delegate] myVar] везде.

Как именно вы собираетесь использовать эту переменную?

1 голос
/ 22 февраля 2011

Как насчет использования одноэлементного класса для сохранения всех переменных, к которым может обращаться любой класс, и область действия - это вся среда выполнения приложения.Проверьте эту ссылку

...