2012-01-02 13 views
1

私は変数NSString sessionIdを宣言しました。アプリケーションのデリゲートファイルをグローバルに使用します。グローバル変数の値の問題iPhone

appdelegate.m

@synthesize sessionId; 

でappdelegate.h

@property (strong, nonatomic) NSMutableString *sessionId; 

そして、このように私のビューコントローラのいずれかでそれを使用。

((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID.retain; 

NSLog(@"session id = %@", ((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId); 

は、私は私のビューコントローラのすべてでその変数セッションIDにアクセスすることが可能だが、問題は、値がそれで救われていないということです。 viewcontroller1.mのように、私はいくつかの値を割り当てましたが、別のviewcontroller2.mでsessionIdにアクセスしたときに、その値がコンソール上でnullとして表示されました。

この問題を解決するにはどうすればよいですか。

コードを追加:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSString *responseString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]; 

self.receivedData = nil; 


    NSError *error; 

    SBJSON *json = [[SBJSON new] autorelease]; 

    NSArray *session = [json objectWithString:responseString error:&error]; 

    SBJsonParser *parser =[[SBJsonParser alloc] init]; 

    NSDictionary *jsonObject = [parser objectWithString:responseString]; 

    sID = [jsonObject objectForKey:@"session"]; 

    ((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID; 

    NSLog(@"session id = %@", ((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId); 


    NSUserDefaults *sessID = [NSUserDefaults standardUserDefaults]; 

    [sessID setObject:sID forKey:@"sessionID"]; 

    [sessID synchronize]; 

    NSLog(@"This session %@ saved", sID); 

    NSDictionary *accountsObj = [parser objectWithString:responseString]; 

    NSString *accounts = [accountsObj objectForKey:@"account"]; 

    NSArray *accountList = [accounts componentsSeparatedByString:@","]; 

    NSLog(@"Accounts: %@", accountList); 


    if (session == nil) 
    NSLog(@"JSON parsing failed: %@", [error localizedDescription]); 
else { 

    if (accountList.count > 1) { 

     ChooseAccountsController *accountsView = [[ChooseAccountsController alloc] initWithNibName:@"ChooseAccountsController" bundle:nil ]; 

     self.chooseAcc = accountsView; 

     [self.view addSubview: accountsView.view]; 
    } else if (accountList.count == 1) { 

      MainScreenController *mainScreen1 = [[MainScreenController alloc] initWithNibName:@"MainScreen" bundle:nil ]; 

      self.mainScreen = mainScreen1; 

      [self.view addSubview: mainScreen1.view]; 

     } 
    } 

} 
+0

最初に変数を宣言した方法を教えてください。 –

+0

私の質問 – AppDeveloper

+0

を編集しました。あなたの変数の命名は恐ろしいです!あなたのユーザのデフォルトを名前sessIDに割り当てるのはなぜですか? – vikingosegundo

答えて

1
((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID.retain; 

は、メッセージが保持しても

((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID 

強い性質を保持しなければならないとしてみてください、そして、有効なコードではありませんので、あなたは(ないこのケースでは)これを必要とする場合のみ、正しい構文は次のとおりです。 [anObject retain]

は、私はラインを考える

((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = [jsonObject objectForKey:@"session"]; 
+0

私もそのコードを試したが、それでも値を表示していない – AppDeveloper

+0

次に、sIDが作成されたときに問題が発生し、 。 – vikingosegundo

+0

ちょっと私はviewcontroller1を残している間、コンソールに何かを持っている、sessionIdはnullに設定しています。なぜそれが起こっているのですか?どのように値を保持することができます – AppDeveloper

0

は、正直なところ、これが動作しない理由を知っているが、この変数を保存し、アクセスするためにシングルトンオブジェクトを作成しようといけません。これはよりエレガントで、あなたの意図に役立ちます。

+1

AppDelegateはシングルトンです – vikingosegundo

+0

ああ...私は何も言わなかった –

+1

@DennsS。スタイルの理由からappDelegateを混乱させる代わりに、別のシングルトンを使用することをお勧めします。しかし、それはOPが持っている問題を解決しません。その唯一の良いスタイルの質問です。 – Till

0

を試してみてください

((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID.retain; 

は、そのセットを確認するviewcontroller1に

((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID; 

私はそれがクラッシュすることなく、すべてで働いていたことだろう...

+0

彼はアークを使用しています - したがって強い特性 – vikingosegundo

+0

ARCが無効になっても保持するように変換されます。つまり、明示的に述べるまではわかりません;-) –

+0

まだそのプロパティは保持されていますので、あなたのコードは – vikingosegundo

0

のNSLogにその価値をお読みください。

もしそうなら、viewcontroller2では、アクセスしようとするとsessionidを再定義している可能性が高いです。

また、AppDelegateの外でシングルトンを作成することもできます。

+0

viewcontroller1で結果はコンソールで2回表示され、割り当てられた値が表示され、2番目の結果ではnullと表示されます...この動作が得られません – AppDeveloper

関連する問題