Глобальные объекты iphone - PullRequest
0 голосов
/ 29 июня 2010

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

@implementation UV_TouchpadViewController;
NSMutableString *string = [NSMutableString stringWithFormat:@"text"];

Ответы [ 6 ]

3 голосов
/ 29 июня 2010

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

NSMutableString *string;

, но если он будет использоваться только внутри файла реализации (например, другие классы получат его только через UV_TouchpadViewController, а не получат / установят его напрямую (это такжерекомендуемый шаблон)), затем квалифицируйте его как статический, например,

static NSMutableString *string;

Если, с другой стороны, вы хотите иметь доступ к нему напрямую из UV_TouchpadViewController, оставьте статический, но добавьте

extern NSMutableString *string;

в файл header (вне класса @interface), и тот, кто включит заголовок, сможет получить к нему доступ.(Обратите внимание, что вместо этого вы можете просто поместить NSMutableString *string; в заголовочный файл, однако это быстро становится неясным)

Кроме того, если вы пытаетесь сделать это для одноэлементного класса (я не могу думать охорошая причина иметь глобальную изменяемую строку - вы знаете, что они не безопасны для потоков, верно?) Я рекомендую сначала прочитать документы Apple по синглетам, где они предлагают использовать ивары, а не глобальные переменные, даже для синглетонов.Однако UV_TouchpadViewController не должен даже быть синглтоном (если он каким-либо образом является контроллером представления), он должен иметь только один экземпляр, если это все, что вы хотите.

Если нас другой стороны, вы просто хотите, чтобы все UV_TouchpadViewControllers имели доступ к этой единственной переменной, обратите внимание, что почти во всех языках это считается плохим шаблоном проектирования (глобальные переменные являются плохими), и что вы должны вместо этого вставить его, скажем, в делегат приложения (гарантированно будет иметь один глобально доступный экземпляр), где это могут быть элементы доступа ivar + и, как правило, считается настройкой и (с небольшим дополнительным кодом) сохраняется.

РЕДАКТИРОВАТЬ:

Если вы хотите иметь синглтон, поддерживающий глобальное состояние, против которого я все еще рекомендую - вы должны создать класс, например, ApplicationState,который обрабатывает все глобальное состояние приложения как объект модели в традиционном шаблоне модель-представление-контроллер.Я не буду вдаваться в подробности, потому что это было бы крайне избыточно для поиска в Google.

В вашем Application Application где-нибудь добавьте ivar ApplicationState *state и соответствующий @property (и @synthesize в файле реализации).).

1 голос
/ 29 июня 2010

Есть несколько простых способов выстрелить себе в ногу, чем с помощью глобальных переменных.

Вы никогда не должны выставлять тупой объект, такой как строка, который не имеет контроля доступа к каждому объекту в приложении. Любой случайный фрагмент кода в любом месте приложения может изменить изменчивую строку, приводящую к хаосу, когда приложение становится больше.

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

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

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

Я использую Apple API уже много лет, и мне никогда не приходилось использовать настоящую глобальную переменную. Если вы думаете, что вам это нужно, вы, вероятно, неправильно поняли дизайн приложений в Apple API. Возможно, вы захотите опубликовать вопрос, объясняющий, что вы пытаетесь сделать с глобальной переменной, и какова должна быть лучшая стратегия, чтобы сделать это без опасности использования глобальной переменной.

0 голосов
/ 17 августа 2013

на самом деле, согласно моим исследованиям, я понял, что используя extern, мы должны создать экземпляр, но в конечном итоге #define ваша переменная и может получить доступ к любому месту, куда вы хотите, без создания экземпляра, а другие вещи просто напрямую используют переменную по имени ....

0 голосов
/ 29 июня 2010

Добавить:

NSMutableString *globalString = nil;

к любому файлу .m любого объекта. Инициализация nil добавляет немного безопасности, поскольку объекты nil могут быть «безопасно» переданы без непосредственного сбоя приложения.

Добавить:

extern NSMutableString *globalString;

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

Добавить:

if (globalString == nil) {
    globalString = [ [ NSMutableString stringWithFormat:@"text"] retain ];
}

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

Глобалы - это менее многословная форма синглтона, но без ограничения доступа или отслеживания. Используйте с осторожностью.

0 голосов
/ 29 июня 2010

Этого можно добиться, реализовав методы getter и setters в классе делегатов.

В файле делегата .h

Включить делегата UIApplication

 @interface DevAppDelegate : NSObject <UIApplicationDelegate>

  NSString * currentTitle;

 - (void) setCurrentTitle:(NSString *) currentTitle;
 - (NSString *) getCurrentTitle; 

В классе реализации делегата .m

 -(void) setCurrentLink:(NSString *) storydata{
currentLink = storydata;

}

-(NSString *) getCurrentLink{
if ( currentLink == nil ) {
    currentLink = @"Display StoryLink";
}
return currentLink;
}

Таким образом, переменная, которую вы оцениваете, устанавливается в строке currentlink с помощью метода setters и класса, где вы хотите строку, просто используйте метод getter.

AppDelegate *del=(AppDelegate *)[[UIApplication sharedApplication]delegate];
TO set:
[del setCurrentLink];
TO Get:
NSString *value=[del getCurrentLink];

Всего наилучшего

0 голосов
/ 29 июня 2010

Вам нужно это для каждого экземпляра класса?Если это так, вы должны сделать его переменной Instance.Поместите

NSMutableString *string;

в заголовок

И тогда вы можете установить его любым методом в своем классе.

Если это не то, что вы имели в виду, обновите ваш вопросили комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...