2009-05-18 5 views
0

Je sais que c'est une quête de base, mais je ne trouve pas une bonne réponse. J'ai une application avec plusieurs contrôleurs de vue et je l'ai remarqué que si créer une variable et de prendre des mesures à ce sujet dans un contrôleur:Gestion de la mémoire des variables sur l'iPhone

int foo = 0; 
foo =+ 1; 

Je peux déclarer la variable dans un autre contrôleur sans l'initialiser est la valeur qu'elle réalisera la la valeur à la dernière série dans le contrôleur de vue précédente:

int foo; 
if (foo == 1) 
    doSomething; 

Je l'ai utilisé à mon avantage pour garder trace du joueur actif dans un jeu multi-joueurs, etc ... en utilisant les données de plusieurs contrôleurs comme leur les vues sont chargées et supprimées. Je suis nouveau à l'Obj. C et d'après ce que j'ai lu, cela ne semble pas être la bonne façon de faire les choses.

Alors, voici ma question, est-ce un moyen sûr de transmettre des données entre les contrôleurs et sinon que dois-je faire?

Répondre

1

Ce n'est pas un moyen sûr de passer des informations entre les contrôleurs. Si vous l'utilisez dans votre application et que cela fonctionne, je suis vraiment très surpris.

La meilleure façon de procéder consiste à transmettre la valeur dont vous avez besoin d'un contrôleur à l'autre. L'exemple ci-dessous utilise le délégué d'application pour stocker la valeur, puis chaque contrôleur la lit/écrit ... c'est juste un exemple, faites attention à utiliser le délégué d'application comme référentiel pour ce qui devient effectivement des variables globales. La configuration de nombreuses variables dans le délégué d'application pour l'utiliser de cette manière rendra votre application difficile à maintenir.

Dans votre App Delegate.h

@interface AppDelegate : NSObject <UIApplicationDelegate> { 
    int sharedInt; 
} 
@property int sharedInt; 

Dans votre App Delegate.m

@synthesize sharedInt; // this will automatically create the getters and setters 

Ensuite, dans le contrôleur où vous souhaitez définir la valeur:

ApplicationDelegateClassNameHere * applicationDelegate = [[ UIApplication sharedApplication] delegate]; 
applicationDelegate.sharedInt = 3; 

Ensuite, dans le contrôleur où vous voulez lire la valeur:

ApplicationDelegateClassNameHere * applicationDelegate = [[ UIApplication sharedApplication] delegate]; 
if (applicationDelegate.sharedInt == 3) { 
    //do your stuff here 
} 

Édité: oublié le @synthesize.
Édité: a tapé le retour de la méthode du délégué singleton, basé sur une suggestion de Kenneth Ballenegger, pour éliminer les avertissements du compilateur.

+0

Merci pour la réponse détaillée depuis que je suis nouveau à ce que le code complet aide vraiment. J'ai implémenté ceci et cela fonctionne très bien. Merci, – Aaron

1

Il semble que vous déclariez une variable globale (ce que permet C), et il n'est pas recommandé de passer des valeurs entre les contrôleurs de vue.

Vous devriez avoir un objet avec votre état, et le transmettre aux contrôleurs qui en ont besoin.

1

Je recommande de faire (et de faire) quelque chose de similaire à la réponse de mmc. Cependant, sa réponse vous amènera à beaucoup d'avertissements. Vous devez vous assurer que vous obtenez un objet AppDelegate *, et pas n'importe quel objet (id) (comme vous le faites avec la méthode de mmc).

il suffit d'ajouter une méthode de classe +singleton (ou +sharedDelegate) à votre délégué comme ceci:

+ (iLaughAppDelegate *)singleton 
{ 
    iLaughAppDelegate *delegate = (iLaughAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    return delegate; 
} 
+0

Excellente suggestion. Je n'utilise pas souvent ce modèle, et oui, les avertissements auraient eu sur mes nerfs. – mmc

+0

Juste fait une petite expirimentation, et il semble que je tape la reurn, plutôt que d'utiliser id, la méthode singleton ne doit pas réellement être dans ma classe de délégué ... UIApplication gère pour moi. Changer mon code, avec une note où j'ai eu l'idée. – mmc

+0

Oui, ça ira très bien. Cependant, je crois que vous recevrez toujours un avertissement si vous ne lancez pas la valeur de retour avant de l'assigner. Dans votre code suggéré, je vous suggérerais de le faire: ApplicationDelegateClassNameHere * applicationDelegate = (ApplicationDelegateClassNameHere *) [[UIApplication sharedApplication] delegate]; –

0

Ceci est bien si elle est faite correctement, mais ne devrait être fait pour les données en lecture seule. C'est un moyen extrêmement commun de partager des constantes de chaîne. Par exemple:

MyObject.h

extern NSString* const MyObjectWillChangeNotification; 

MyObject.m

NSString* const MyObjectWillChangeNotification = @"MyObjectWillChangeNotification"; 

AnotherObject.m

#import "MyObject.h" 
// You can now use MyObjectWillChangeNotification in this file 

Ce même processus fonctionnera sur le plan technique pour votre int, mais vous ne devriez 't, comme cela a été noté précédemment. Il est beaucoup plus sûr de permettre à une variable donnée d'être gérée par un seul et même objet. Tout le monde devrait y arriver grâce à un accesseur.

Questions connexes