2013-07-29 5 views
0

«Токен» будет предоставлен после аутентификации в виде XML-файла с некоторыми другими элементами.Как сделать переменную доступной глобально объектной c

Мне удалось извлечь токен и отобразить его в вызывающем классе, скажем, parser.m.

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

Обратите внимание, что при следующей аутентификации будет указан другой токен.

.h:

@interface Parser : NSObject <NSXMLParserDelegate>{ 
NSXMLParser *parser; 
NSMutableString *element; 
NSMutableString *token;} 
@property (nonatomic, retain) NSMutableString *token; 
@end 

.m:

#import "parser.h"

NSLog (@ "лексема вызывается из основной:% @", parser-> маркер) ;

Он не в состоянии получить доступ к «маркер», который был объявлен под parser.m

Как обойти это?

Обновление 1: Я узнал, что использование @public также служит цели. Не уверен, что это хороший ход или нет, так как мне понадобится токен во всех моих вызовах API.

+0

использовать 'parser.token' вместо' parser-> token' ?! –

ответ

1

Для временных переменных рассмотрите возможность использования экземпляра singleton, такого как класс MySingleton, проиллюстрированный в этом ответе. Как создать синглтон: What should my Objective-C singleton look like?. Доступ к переменной можно получить так: [MySingleton sharedSingleton].variable; Синглтон - хороший выбор, если у вас много глобальных переменных, но если только один лучше использовать NSUserDefaults.

NSUserDefaults - это то, что требует стойкости, т. Е. Вы планируете хранить их между запусками приложений. Хороший стартер: http://mobile.tutsplus.com/tutorials/iphone/nsuserdefaults_iphone-sdk/

Также почитайте: Are global variables bad?

+0

+1 для ссылки на глобальные переменные вопрос –

0

Попробуйте это:

[[NSUserDefaults standardUserDefaults]setObject:_YourObject_ forKey:@"token"]; 

NSString *str = [[NSUserDefaults standardUserDefaults] stringForKey:@"token"]; 

Или Вы можете использовать синглтон.

0

Попробуйте объявить, что varible в Appdelegate как свойство и синхронизировать его в .m. Или использовать этот вариант в любом классе с помощью этого.

AppDelegate * appdelegate=(AppDelegate *)[[UIApplication sharedApplication]delegate]; 
    AppDelegate.yourvarible; 

или либо вы использовали NSUserDefault.

[[NSUserDefaults standardUserDefaults]setObject:token forKey:@"tokan"]; 
+3

Как узнать, что у вас был первый вопрос? Потому что вы сделали ту же ошибку TOKAN – Andrea

2

создать одноэлементный класс для глобальной переменной в Objective C

в файле .h

#import <Foundation/Foundation.h> 

    @interface Singleton : NSObject 
    { 
      ///...... 
    } 

    + (Singleton *)sharedSingleton; 

в.м-файл

#import "Singleton.h" 

    @implementation Singleton 
    static Singleton *singletonObj = NULL; 

    + (Singleton *)sharedSingleton 
    { 
      @synchronized(self) 
      { 
        if (singletonObj == NULL) 
          singletonObj = [[self alloc] init]; 
      } 
      return(singletonObj); 
    } 

и использовать это в другом файле

#import "Singleton.h" 
    //..... 

    Singleton *sinObj = [Singleton sharedSingleton]; 

и создавать переменные внутри, что, а также написать сеттер и геттер для этой переменной в одиночки класса. Получите доступ к этому методу и переменной, используя sinObj объект singleton class

0

Вы можете создать свойство в ur appdelegate и установить свойство, когда u получит токен.

//getter 
NSString *token=[(MyAppDelegate *)[[UIApplication sharedApplication] delegate].recievedToken; 

//setter 
[(MyAppDelegate *)[[UIApplication sharedApplication] delegate].recievedToken=token; 
2

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

+0

Есть одна вещь хуже, чем одиночные игры. И это использует NSUserDefaults в качестве глобального хранилища данных. ;-) –

Смежные вопросы