在全局变量Objective-C Iphone中丢失数据

时间:2012-10-13 04:02:59

标签: iphone objective-c global-variables appdelegate

我想在我的代码中使用全局变量。我有一些使用某些实例的ViewController,因此使用global会更容易,然后在控制器之间传递实例。

因此,我在AppDelegate中创建了全局:

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>{
    //Global Variables
    NSInteger userID;
    NSMutableArray *friends;
}
@property (assign, nonatomic) NSInteger userID;
@property (strong, nonatomic) NSMutableArray *friends;

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    self.friends = [[NSMutableArray alloc] init];
    return YES;

}

我在ViewControllerN.h中添加此代码的任何控制器中访问全局:

#import "AppDelegate.h"
#define global \ ((AppDelegate *)[UIApplication sharedApplication].delegate)

所以在ViewControllerN.m中我可以访问全局,例如:

[global.friends addObject:@"Henry"];

完美无缺。但在某个地方,我正在丢失来自全球的数据。

我在PageControllerA(ControllerA)

中启动我的应用程序
  • 控制器A具有带ControllerB,C和D的scrollView。
  • 我将数据添加到ControllerA viewdidLoad
  • 中的global.friend
  • 控制器B,C,D可以在viewDidLoad中正确访问全局,但是当我从任何一个控制器调用一个方法时,global.friend都是空的。
  • 控制器B呼叫控制器E,但对于控制器E,global.friend也为空。

我只在global.friend中使用白色数据,从不删除任何对象。

为什么我会丢失数据? (global.friend empty)

1 个答案:

答案 0 :(得分:0)

正如Josiah在其中一个答案中所建议的那样,有更好的方法可以做到这一点。 但是,我喜欢使用全局变量,有时我会创建一个NSObject类并在那里声明全局变量。

为此,您需要创建一个新的NSObject文件。 在* .h文件中,在界面上方,您应该声明变量使用'extern'

extern NSMutableDictionary *SavedUsersDictionary;

在* .m文件中,你的变量应该高于界面而不是'extern'

NSMutableDictionary *SavedUsersDictionary;

然后在需要使用变量的任何地方导入类。 您还可以将变量设置为类属性并进行合成。

希望有所帮助。