2012-10-13 1 views
-1

Я хочу использовать глобальные переменные в своем коде. У меня есть некоторый ViewController, который использует некоторые экземпляры, поэтому использовать global будет проще, чем передавать экземпляры между контроллерами.потеря данных в глобальных переменных Objective-C Iphone

Таким образом, я создаю глобальное в 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)

  • контроллер имеет Scrollview с ControllerB, C и D.
  • добавляют данные в global.friend в ControllerA viewdidLoad
  • контроллер B, C, D может получить доступ к глобальному правилу в viewDidLoad, но когда я вызываю метод из любого из этих контроллеров, global.friend Empty.
  • Контроллер вызова B E, но global.friend также пуст для контроллера E.

Я только белые данные в global.friend, никогда не удаляю никаких объектов.

Почему я теряю данные? (global.friend empty)

+1

Вопрос в том, почему вы используете глобальные переменные? Идите против стандарта, Apple определила передовую практику и, конечно, вы столкнетесь с проблемами.Объявите переменные static, и это может решить вашу проблему. [Или попробуйте этот подход] (http://stackoverflow.com/q/338195/874257) –

+1

Это не глобальные переменные. Это переменные экземпляра App Delegate (singleton). – hotpaw2

+0

Вы выделили свой изменяемый массив, прежде чем пытаться добавить к нему объекты? Проверьте порядок вызовов методов. – hotpaw2

ответ

0

Как было предложено Josiah в одном из ответов, здесь есть лучшие способы сделать это. Однако мне нравится использовать глобальные переменные, а также несколько раз, и я обычно создаю класс NSObject и объявляю там глобальные переменные.

Для этого вам необходимо создать новый файл NSObject. в * .h файле, над интерфейсом, вы должны объявить переменную с помощью «Экстерн»

extern NSMutableDictionary *SavedUsersDictionary; 

в * .m файл, который вы должны переменная над интерфейсом без «Экстерн»

NSMutableDictionary *SavedUsersDictionary; 

Затем импортируйте класс везде, где вам нужно использовать переменную. Вы также можете установить переменную как свойство класса и синтезировать ее.

Надеюсь, что это поможет.