Quelle est la manière la plus propre d'utiliser quelque chose comme une variable globale? Normalement, l'utilisation d'une variable globale est interdite, mais je ne connais pas de meilleure solution pour accéder à NSUserDefaults depuis différentes classes. Je lis un peu et viens avec ça. Je définis un Contants.h et un fichier Constants.m et les inclut partout où je dois.Comment définir une variable globale de type NSUserDefaults et initialiser une valeur?
. Le problème ici est que je veux initialiser une valeur à ma constante. Je n'ai aucune méthode dans Constants.m. Donc mes variables auxiliaires seraient aussi globales?
Une chose à mentionner: Je pense que la variable globale doit également être libérée?
Merci pour votre aide!
Edit:
@ hotpaw2:
AppBundleSingleton.h:
#import <Foundation/Foundation.h>
@interface AppBundleSingleton : NSObject {
}
+ (AppBundleSingleton *)sharedAppBundleSingleton;
@end
AppBundleSingleton.m:
#import "AppBundleSingleton.h"
static AppBundleSingleton *sharedAppBundleSingleton = nil;
@implementation AppBundleSingleton
#pragma mark -
#pragma mark Singleton methods
+ (AppBundleSingleton *)sharedAppBundleSingleton {
@synchronized(self) {
if (sharedAppBundleSingleton == nil) {
sharedAppBundleSingleton = [[self alloc] init];
}
}
return sharedAppBundleSingleton;
}
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if (sharedAppBundleSingleton == nil) {
sharedAppBundleSingleton = [super allocWithZone:zone];
return sharedAppBundleSingleton; // assignment and return on first allocation
}
}
return nil; // on subsequent allocation attempts return nil
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)retain {
return self;
}
- (NSUInteger)retainCount {
return NSUIntegerMax; //denotes an object that cannot be released
}
- (void)release {
//do nothing
}
- (id)autorelease {
return self;
}
-(id)init {
self = [super init];
sharedAppBundleSingleton = self;
// Initialization code here
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"plist"];
NSDictionary *settingsDict = [NSDictionary dictionaryWithContentsOfFile:filePath];
[[NSUserDefaults standardUserDefaults] registerDefaults:settingsDict];
return self;
}
@end
Dans mon AppDelegate.m je les suivantes :
// ...
#include "AppBundleSingleton.h"
@implementation MyAppDelegate
// ...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Add the navigation controller's view to the window and display.
[window addSubview:navigationController.view];
[window makeKeyAndVisible];
[AppBundleSingleton sharedAppBundleSingleton];
return YES;
}
// ...
@end
Dans mon ViewController je les valeurs: questionne
NSString *myString = [[NSUserDefaults standardUserDefaults] stringForKey:@"myKeyforString"];
Serait-ce une solution?
J'ai édité ma question. J'ai maintenant créé un singleton avec une méthode init, qui initialise mon NSUserDefaults à partir d'un fichier plist. Je n'ai plus besoin d'une variable globale. J'accède à mon instance de Singleton dans didFinishLaunchingWithOptions. Est-ce correct? Cela fonctionne jusqu'à présent, mais vous avez mentionné que "certaines vues qui nécessitent une configuration initiale par défaut peuvent être appelées avant appDidFinishLaunching". Comment joindre mon singleton à appDelegate sans utiliser didFinishLaunching? J'appelle directement NSUserDefaults, donc l'obtention de n'importe où est déjà possible. – testing
Le processus d'auto-initialisation est effectué avec l'appel de sharedAppBundleSingleton et la méthode init écrite. Que voulez-vous dire avec les choses d'encapsulation? Ai-je besoin de ces propriétés? Je fais déjà l'initialisation de mes valeurs par défaut dans la méthode init du singleton. – testing
Y a-t-il quelqu'un ici? – testing