2012-04-20 5 views
2

Я хотел бы использовать мой AppDelegate для хранения объекта, который будет доступен для любых других классов. Я объявил эту 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 

Спасибо за любую помощь!

+0

Вы говорите, что 'testGlobal' равна нулю, но вы уверены, что' 'trackerTEST' и appDelegate' не тоже ноль? – jtbandes

+0

хорошо узнал, что appDelegate в порядке, но trackerTEST - это ноль ... хммм ... что я тут делаю неправильно? :) –

ответ

2

Проверьте, не вызывается ли application:didFinishLaunchingWithOptions:, добавив NSLog(@"..."). Если значение trackerTEST равно нулю, возможно, оно было неправильно инициализировано.

+1

СПАСИБО! Я наконец понял это благодаря вам ... это была действительно глупая ошибка :) Я инициализировал трекер в конце приложения: didFinishLaunchingWithOptions:, который после того, как я использовал ... grrr :) спасибо, действительно :) –

+0

You приветствуются. Я бы предложил переместить инициализацию на ваш метод 'init'. Но я не настолько квалифицирован, чтобы быть уверенным, что это достойное решение. : D – DocJones

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

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

@end 

Почему у вас есть трекер и т. Д. @property?

Попробуйте удалить MyClass *tracker; недвижимости должно быть достаточно.

+0

ну, я был в отчаянии, поэтому я попытался добавить его туда :), но удаление его не помогло, оно все равно ноль ...:/ –

0

Изменить @synthesize testGlobal = _testGlobal; на @synthesize testGlobal; и повторите попытку.

+0

не помогло ни ...: проблема в том, что объект я получаю от appdelegate ноль ... –

4

Возможно, я отвечаю допоздна, но вы можете взглянуть на Singleton Pattern.

В разработке программного обеспечения одноэлементный шаблон представляет собой шаблон проектирования, используемый для реализации математической концепции одноэлементности, путем ограничения экземпляра класса на один объект. Это полезно, когда необходим один объект для координации действий в системе. Концепция иногда обобщается на системы, которые работают более эффективно, когда существует только один объект, или которые ограничивают создание экземпляра определенным количеством объектов.

Вот реализация ObjC: http://getsetgames.com/2009/08/30/the-objective-c-singleton/

+0

defiitely не поздно ... его хороший ответ;), но потом я решил скорее использовать этот метод ... синглеты слишком сложны для меня в этом случае ... но спасибо в любом случае –

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