2010-08-26 4 views

Répondre

37

(je suppose loggedIn est une méthode d'instance prenant aucun paramètre.) Tout d'abord, plusieurs questions de terminologie:

  1. Ils ne sont pas des fonctions, ils sont méthodes (même idée, cependant).
  2. Vous n'appelez pas les méthodes, vous envoyer des messages (habituellement même idée, si). Plus important encore, nous envoyons généralement des messages non aux classes, mais à instances de ces classes. (Si vous ne pouvez pas visualiser la différence, imaginez placer une lettre dans l'idée de boîtes aux lettres par rapport à placer une lettre dans votre boîte aux lettres . Un seul a du sens!)

Ainsi, notre nouveau plan est Pour commencer instancier SomeScript, puis envoyer un message à l'instance.

SomeScript* myScript = [[SomeScript alloc] init]; //First, we create an instance of SomeScript 
[myScript loggedIn]; //Next, we send the loggedIn message to our new instance 

Ceci est bon. Toutefois! Je parie que vous voulez que votre script reste en place pour une utilisation ultérieure. Ainsi, nous devrions vraiment en faire une variable d'instance de votre délégué d'application. Donc, à la place, dans AppDelegate.h, ajoutez les accolades:

SomeScript* myScript; 

Maintenant, notre variable rester, et notre première ligne d'avant devient simplement:

myScript = [[SomeScript alloc] init]; 

complication Dernière: nous ne voulons pas créer une nouvelle script chaque fois que nous appelons loggedIn (je suppose)! Vous devez donc placer l'instanciation quelque part pour qu'elle ne soit exécutée qu'une seule fois (par exemple, application:DidFinishLaunchingWithOptions:). Ta-da!

+0

Vous devez ajouter quelque chose sur la libération myScript – JeremyP

+0

@JeremyP: Il est dans son AppDelegate. @ChristianStewart: Jeremy a raison, vous devriez normalement envoyer 'release' à' myScript' quand vous en aurez fini. Je ne vous l'ai pas dit parce que je supposais que vous l'utiliseriez tout le temps que votre application est ouverte. – andyvn22

+0

Cela ne fait aucun mal de prendre de bonnes habitudes. Techniquement, vous n'avez pas besoin de publier quoi que ce soit que votre délégué d'application conserve, car le délégué de l'application reste jusqu'à la fin. Cependant, c'est une bonne idée de prendre l'habitude de mettre la version dans -dealloc. Il doit devenir automatique. – JeremyP

3

Vous aurez une référence initialisé d'un objet SomeScript dans votre classe AppDelegate (en supposant que vous n'avez pas besoin SomeScript d'être une classe Singleton comme votre AppDelegate). Quelque chose comme:

SomeScript * myScript;

comme Ivar dans votre interface AppDelegate, alors que dans son application:DidFinishLaunchingWithOptions:

vous inited il (supposons que la alloc par défaut/combo init appelant):

myScript = [[SomeScript alloc] init]

fait tout cela, quand vous avez besoin d'appeler une méthode de myScript vous pouvez simplement faire:

[myScript myMethod:myParameter]

Here vous pouvez trouver un bon guide pour les débutants d'Apple

1

Si vous ne voulez pas utiliser des instances de SomeScript ... vous pouvez suivre une approche différente. Utilisez NSNotificationCenter pour envoyer une notification à votre objet SomeScript et lui faire exécuter un sélecteur par la suite.

Dans votre - méthode (void) awakeFromNib {}, de SomeScript placer le code suivant:

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(mySelector:) 
               name:@"aUniqueNameForTheNotification" 
               object:nil]; 

Créer la méthode "mySelector:" et placez-le à l'appel à votre méthode de loggedIn. (Ou si vous préférez, vous pouvez remplacer « mySelector: » avec loggedIn directement)

-(void) mySelector:(id)elem 
{ 
    [self loggedIn]; 
} 

Merci de ne pas oublier d'enlever l'observateur sur dealloc, donc placez le morceau de code suivant dans votre classe SomeScript aussi:

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

Ensuite, vous pouvez envoyer une notification de toute autre façon:

[[NSNotificationCenter defaultCenter] postNotificationName:@"aUniqueNameForTheNotification" object:self]; 

Ce dernier morceau de code envoie une notification à SomeScript et votre sélecteur est exécuté.

J'espère que ça vous aidera les gars!

1

Nous pouvons l'appeler comme [self loggedIn]
Lorsque méthode loggedIn est SomeScript classe, en utilisant syntaxes simples dans le dernier Xcode.

[[SomeScript new] loggedIn]; 
+0

Est-ce que cela nécessite une désaffectation par la suite? Je suppose qu'il n'y a aucun moyen de .. – durazno

+1

avec ARC aucune désaffectation requise. –

Questions connexes