L'utilisation de variables globales en Objective-C
Tout d'abord, j'ai essayé presque toutes les solutions données dans stackoverflow mais je n'ai pas réussi à mettre en œuvre les variables globales, j'ai même fait une étape par étape tutoriel et encore j'obtiens les mêmes erreurs.
heres la question:
J'ai un programme avec plusieurs vues, j'aimerais utiliser des variables sur tous les points de vue,
j'ai donc utilisé des variables globales,
J'ai:
GlobalVars.h
#import <UIKit/UIKit.h>
extern NSArray *truckBoxes;
extern NSArray *farmerlist;
extern NSString *farmerCardNumber;
extern NSString *fName;
@interface GlobalVars : NSObject
{
}
@end
GlobalVars.m
#import "GlobalVars.h"
NSArray *farmerlist;
NSArray *truckBoxes;
NSString *farmerCardNumber;
NSString *fName;
@implementation GlobalVars
{
}
@end
- Je inclure le fichier dans la classe (qui est connecté à la vue-contrôleur):
dans le cadre du .h fichier que j'ai ajouter #import "GlobalVars.h
Je peux accéder à farmerlist
et truckBoxes
de tous les plus de l'application, mais ne peut pas accéder fName
ou farmerCardNumber
.
Je peux écrire à farmerCardNumber
et lire à partir du même point de vue, mais si j'essaie d'accéder plus tard à partir d'un autre point de vue, je reçois
2013-10-26 11:11:45.612 C3Cms[10427:70b] Branch : 11558
2013-10-26 11:11:59.459 C3Cms[10427:70b] -[__NSArrayM length]: unrecognized selector sent to instance 0x8b7fbc0
2013-10-26 11:11:59.463 C3Cms[10427:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM length]: unrecognized selector sent to instance 0x8b7fbc0'
*** First throw call stack:
(
0 CoreFoundation 0x02a3b5e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x014d58b6 objc_exception_throw + 44
2 CoreFoundation 0x02ad8903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
3 CoreFoundation 0x02a2b90b ___forwarding___ + 1019
4 CoreFoundation 0x02a2b4ee _CF_forwarding_prep_0 + 14
5 Foundation 0x00f0db2d -[NSConcreteMutableAttributedString replaceCharactersInRange:withString:] + 39
6 Foundation 0x00f0e79a -[NSConcreteMutableAttributedString initWithString:attributes:] + 293
7 UIKit 0x001e8116 -[UILabel _setText:] + 97
8 UIKit 0x001e82d4 -[UILabel setText:] + 40
9 C3Cms 0x00001c1d -[printForm viewDidLoad] + 77
10 UIKit 0x0014e9a8 -[UIViewController loadViewIfRequired] + 696
11 UIKit 0x0014ec44 -[UIViewController view] + 35
12 UIKit 0x00168a72 -[UINavigationController _startCustomTransition:] + 778
13 UIKit 0x00175757 -[UINavigationController _startDeferredTransitionIfNeeded:] + 688
14 UIKit 0x00176349 -[UINavigationController __viewWillLayoutSubviews] + 57
15 UIKit 0x002af39d -[UILayoutContainerView layoutSubviews] + 213
16 UIKit 0x000a5dd7 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
17 libobjc.A.dylib 0x014e781f -[NSObject performSelector:withObject:] + 70
18 QuartzCore 0x030d772a -[CALayer layoutSublayers] + 148
19 QuartzCore 0x030cb514 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
20 QuartzCore 0x030cb380 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
21 QuartzCore 0x03033156 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
22 QuartzCore 0x030344e1 _ZN2CA11Transaction6commitEv + 393
23 QuartzCore 0x03034bb4 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92
24 CoreFoundation 0x02a0353e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
25 CoreFoundation 0x02a0348f __CFRunLoopDoObservers + 399
26 CoreFoundation 0x029e13b4 __CFRunLoopRun + 1076
27 CoreFoundation 0x029e0b33 CFRunLoopRunSpecific + 467
28 CoreFoundation 0x029e094b CFRunLoopRunInMode + 123
29 GraphicsServices 0x029979d7 GSEventRunModal + 192
30 GraphicsServices 0x029977fe GSEventRun + 104
31 UIKit 0x0003b94b UIApplicationMain + 1225
32 C3Cms 0x00002882 main + 130
33 libdyld.dylib 0x019bc70d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Un non initialisée de la matrice est nul et de ne pas provoquer un "non reconnu sélecteur de" l'exception".
double possible de Comment définir une variable globale qui peut être consulté n'importe où dans mon application?
OriginalL'auteur izzy | 2013-10-26
Vous devez vous connecter pour publier un commentaire.
Une façon de mettre en œuvre des variables globales, et de gérer leur vie (c'est à dire qu'ils sont initialisés) et même de fournir des méthodes globales à mettre en œuvre une classe d'exposer ces variables/méthodes et d'utiliser le pattern singleton:
GlobalVars.h:
GlobalVars.m:
Vous pouvez ensuite utiliser ces variables globales, comme ceci, par exemple:
Cependant, veuillez considérer:
Aussi, comment puis-je accéder à ces variables? merci
Énorme faute de frappe. Je vais répondre à ces deux questions...
Incroyable! il fonctionne! merci! pour de futures références, changez @property(forte, nonatomic, readwrite) NSArray *farmerCardNumber; @property(forte, nonatomic, readwrite) NSString *farmerCardNumber;
Une question de suivi, que dois-je faire si je veux int ou double? si je n' @property(forte, nonatomic, readwrite) double *farmerWeight; il dit que la propriété, avec une forte doit être l'objet de type.
OriginalL'auteur trojanfoe
L'erreur n'a rien à voir avec des variables globales. Le message d'erreur
indique que vous avez quelque part dans votre code attribué un
NSMutableArray
àfarmerCardNumber
au lieu d'un
NSString
.Par exemple, si vous faites quelque chose comme
et
[someDictionary objectForKey:@"someKey"]
se trouve être un tableau et non une chaîne de caractères,puis
farmerCardNumber
points à celle du tableau, même si il a été déclaré comme pointeur versune chaîne de caractères.
Insérez
NSLog(@"class=%@", [farmerCardNumber class]);
peu de temps avant de lire la variable, et vérifiez la sortie ...J'ai juste ajouté un nouveau var appelé testVar, et j'obtiens la même erreur.
Votre sens de l'observation était juste, il dit: "2013-10-26 11:46:32.764 C3Cms[10593:70b] class=__NSDictionaryM", mais qu'en serait-il en changer? J'ai fait la chose exacte avec un nouveau var qui est seulement indiqué que 2 fois dans l'ensemble du code et il dit la même chose. ce serait remplacer?
Ce qui est étrange. Comment attribuez-vous à
testVar
? C'est la classe correcte immédiatement après l'écriture?OriginalL'auteur Martin R
Pourquoi ne pas vous essayez quelque chose comme:
ou
ET il semble que vous ayez passé mutable tableau à votre chaîne varibale, c'est pourquoi vous obtenez cette erreur.
OriginalL'auteur Kumar Aditya
J'utilise dans tous mes projets et fonctionne bien.
GlobalResource.h
GlobalResource.m
Comment utiliser
OriginalL'auteur Salim
Supprimer la ligne
de GlobalVars.m.
Un fichier de mise en oeuvre doit toujours importer sa propre interface. Je ne vois pas de problème avec cela, et aussi ne pas comprendre comment ne pas l'importer permettrait de résoudre le problème ci-dessus.
Votre problème, c'est que GlobalVars.m, à la fois de définir vos variables globales et déclare, en outre, comme externes. Votre GlobalVars.h fichier ne peut pas être inclus comme il est. Vous pouvez avoir d'autres problèmes, car GlobalVars.m exige d'autres déclarations dans GlobalVars.h, mais c'est une autre question.
Il n'y a pas de problème si une variable est déclaré comme externes et défini dans la même unité de compilation, et il est de pratique courante pour autant que je sais. Regardez le premier exemple dans stackoverflow.com/a/1433387/1187415.
OriginalL'auteur Philip Sheard
Vous ne pouvez pas mettre extern variables *.h fichier.
Donc dans GlobalVariables.m vous avez:
Et:
ne sont pas nécessaires
[modifier]
par exemple:
Autres.m
GlobalVars1.h
GlobalVars.h
GlobalVars.m
Désolé, mais c'est simplement faux. Le
extern
déclaration doit être dans le .h de fichier, de sorte que d'autres unités de compilation incluant ce fichier le savoir.supprimer la ligne (après Philippe) h partir de ce m, et d'écrire extern ou cette ligne avec h dans les autres *.m
vous devez écrire deux fichiers *.m de faire du sens avec extern
Le GlobalVars.h et GlobalVars.m publié dans la question sont corrects et il n'y a pas de problème avec elle (aussi loin que je peux voir).
OriginalL'auteur theWalker