J'utilise la classe MyGizmoClass Singleton d'Apple pour les «variables de session» à l'échelle du programme et j'adore! Cependant, lorsque je lance "Build and Analyze", cela donne des résultats bizarres. Peut-être que mon utilisation est fausse (cela fonctionne, mais cela peut fonctionner à cause d'un effet secondaire flakey). Voici un exemple.Singletons dans Objective-C pour stocker et accéder aux variables à l'échelle du programme. Quelques questions
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
int ct = 0;
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
ct = [[myGizmoClass searchResultsForResortLocation] count];
[myGizmoClass release];
NSLog(@"ct: %d",ct);
return ct;
}
ou
- (void)viewWillAppear:(BOOL)animated {
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
//self.navigationItem.rightBarButtonItem = self.editButtonItem;
NSMutableString *which_resort = [[NSMutableString alloc] init];
NSMutableString *category_code = [[NSMutableString alloc] init];
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
...
which_resort = [self which_resort_location_are_we_in];
...
[myGizmoClass setWhich_resort:which_resort];
int useDebugMode = [myGizmoClass useDebugMode];
...
[myGizmoClass release];
[which_resort release];
[category_code release];
[super viewWillAppear:animated];
}
Encore une fois, cet usage peut être loin, mais je pensais que chaque méthode je une valeur de singleton je devais faire:
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
et
[myGizmoClass release];
MAIS je reçois ces erreurs lors Analyser:
/Users/jgobble/Documents/ProgramName/Classes/ResortsListViewController.m:495:2 décrément incorrect du comte référence d'un objet n'appartient pas à ce point par l'appelant /Users/jgobble/Documents/ProgramName/Classes/ResortsListViewController.m:493:30 méthode retourne un objet Objective-C avec 0 conserver comptage (non propriétaire référence) /Users/jgobble/Documents/ProgramName/Classes/ResortsListViewController.m: 495: 2 Décrément incorrect de la référence compte d'un objet ne possédait pas au ce point par l'appelant
Maintenant, s'il vous plaît prendre en compte: J'appelle ceci:
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
au début de chaque méthode ont besoin d'une « variable de session », puis appeler :
[myGizmoClass release];
à la fin de ce procédé antérieur pour renvoyer un résultat (si je retourne un résultat à partir de cette fonction.
Est-ce que ce n'est pas comme ça que je devrais le faire?
Ceci est la seule chose que l'analyseur (Dieu merci) signale un problème avec le programme. Je ne sais pas si je devrais l'ignorer. Je ne sais pas si je fais les appels au bon endroit.
Voici une autre question qui m'inquiète: Est-ce que cela fonctionne ou est-ce que les appels suivants à * myGizmoClass gâchent quelque chose?
-(void) function_a {
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
[myGizmoClass setC:1];
int result_b = [self function_b];
printf("Addition result is: %d", result_b);
[myGizmoClass release]
}
-(int) function_b {
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
int b = 0;
b = b + [myGizmoClass c];
[myGizmoClass release]
return b;
}
(je ne l'ai pas testé le code ci-dessus)
En d'autres termes, il y a un problème avec l'appel MyGizmoClass * myGizmoClass = [MyGizmoClass sharedManager]; de function_b lorsque vous n'avez pas publié MyGizmoClass * myGizmoClass = [MyGizmoClass sharedManager]; de function_a?
+1 Une bonne question qui a été très bien présentée. – TechZen