用作全局变量的AppDelegate变量不起作用

时间:2012-04-20 09:33:54

标签: objective-c ios xcode class

我想使用我的AppDelegate来存储任何其他类都可以访问的对象。我已经宣布这个AppDelegate是这样的:

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
{
    MyClass *tracker;
}

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ICViewController *viewController;
@property (retain, nonatomic) MyClass *tracker;

@end

我在应用程序中合成了跟踪器:didFinishLaunchingWithOptions:我在这个对象中设置了一个NSString:

self.tracker = [[MyClass alloc] init];
self.tracker.testGlobal = @"global funguje";

当我需要在其他类的其他地方访问跟踪器时,我使用以下代码:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];    
MyClass *trackerTEST = appDelegate.tracker;
NSLog(@"TEST : %@",trackerTEST.testGlobal);

问题是testGlobal为NULL。我究竟做错了什么?这里还有MyClass的类文件:

@interface MyClass : NSObject
{
    NSString *testGlobal;
}
@property (retain, nonatomic) NSString *testGlobal;
@end

@implementation MyClass
@synthesize testGlobal = _testGlobal;
@end

感谢您提供任何帮助!

4 个答案:

答案 0 :(得分:4)

也许我迟到了,你可以看一下Singleton Pattern

  

在软件工程中,单例模式是一种设计模式,用于通过将类的实例化限制为一个对象来实现单例的数学概念。当需要一个对象来协调整个系统的操作时,这非常有用。这个概念有时会推广到只有一个对象存在时运行效率更高的系统,或者将实例化限制为一定数量的对象。

这是一个ObjC实现:http://getsetgames.com/2009/08/30/the-objective-c-singleton/

答案 1 :(得分:2)

通过添加application:didFinishLaunchingWithOptions:来检查是否正在调用NSLog(@"...")。如果trackerTEST为零,则可能未正确初始化。

答案 2 :(得分:0)

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
{
    MyClass *tracker;
}

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ICViewController *viewController;
@property (retain, nonatomic) MyClass *tracker;

@end

为什么你有@property tracker和var tracker?

尝试删除MyClass *tracker;属性应该足够了。

答案 3 :(得分:0)

@synthesize testGlobal = _testGlobal;更改为@synthesize testGlobal;,然后重试。