全球变量值问题iPhone

时间:2012-01-02 12:54:58

标签: iphone objective-c ios cocoa-touch

我已经声明了一个变量NSString sessionId;在app委托文件中进行全局使用。

在appdelegate.h

@property (strong, nonatomic) NSMutableString *sessionId;

在appdelegate.m

@synthesize sessionId;

并在我的一个视图控制器中使用它。

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

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

我能够在所有视图控制器中识别变量sessionId,但问题是该值未保存在其中。就像在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];

         }
    }

}

4 个答案:

答案 0 :(得分:0)

老实说,不知道为什么这不起作用,但尝试创建一个Singleton对象来保存和访问此变量。这更优雅,应该为你的意图服务。

答案 1 :(得分:0)

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

无效代码,请尝试

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

一个强大的属性应该保留,并且还保留一条消息,所以如果你需要这个(不是在这种情况下),唯一正确的语法是[anObject retain]

尝试

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

答案 2 :(得分:0)

我认为该行

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

应该阅读

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

我不知道它在没有崩溃的情况下工作......

答案 3 :(得分:0)

NSLog在viewcontroller1中的值,以确保其设置。

如果是,则很可能在viewcontroller2中,当您尝试访问时,您正在重新定义sessionid。

此外,您可能想在AppDelegate之外创建一个单例。