2010-08-26 11 views

Respuesta

37

(voy a suponer loggedIn es un método de instancia toma ningún parámetro.) En primer lugar, varias cuestiones de terminología:

  1. Ellos no son funciones, son métodos (la misma idea, sin embargo).
  2. Usted no llama a los métodos, usted envía mensajes (generalmente misma idea, sin embargo).
  3. Lo más importante, generalmente enviamos mensajes no a clases, sino a instancias de esas clases. (Si no puede visualizar la diferencia, imaginar colocar una carta en la idea de buzones frente a la colocación de una carta en su buzón de correo . Sólo uno tiene sentido!)

Por lo tanto, nuestro nuevo plan es primero instantaneo SomeScript, luego envíe un mensaje a la instancia.

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

Esto es bueno. ¡Sin embargo! Apuesto a que quieres que tu script se quede para su uso posterior. Por lo tanto, realmente deberíamos convertirlo en una variable de instancia de su delegado de aplicaciones. Entonces, en cambio, en AppDelegate.h, añadir este dentro de las llaves:

SomeScript* myScript; 

Ahora nuestra variable se quedará, y nuestra primera línea de delante se convierte simplemente:

myScript = [[SomeScript alloc] init]; 

Última complicación: no queremos crear una nueva script cada vez que llamamos loggedIn (supongo)! Por lo tanto, debe colocar la instanciación en algún lugar, solo se ejecutará una vez (por ejemplo, application:DidFinishLaunchingWithOptions:). Ta-da!

+0

es necesario agregar algo en la liberación de myScript – JeremyP

+0

@JeremyP: Está en su AppDelegate. @ChristianStewart: Jeremy tiene razón, por lo general debería enviar 'release' a' myScript' cuando haya terminado con esto. No te lo dije porque supuse que lo usarías todo el tiempo que tu aplicación está abierta. – andyvn22

+0

No hace ningún daño entrar en buenos hábitos. Técnicamente, no es necesario que libere nada de lo que su delegado de la aplicación retiene porque el delegado de la aplicación se queda hasta el final. Sin embargo, es una buena idea adquirir el hábito de poner el lanzamiento en -dealloc. Necesita convertirse en automático. – JeremyP

3

Se deberán tener una referencia de un objeto inicializado SomeScript en su clase AppDelegate (suponiendo que no es necesario SomeScript a ser una clase Singleton como su AppDelegate). Algo así como:

SomeScript * myScript;

como Ivar en su interfaz AppDelegate, mientras que en su application:DidFinishLaunchingWithOptions:

que haya inited que (supongamos que con llamar a la alloc default/combo init):

myScript = [[SomeScript alloc] init]

Hecho todo esto, cuando necesita llamar a un método de myScript simplemente puede hacer:

[myScript myMethod:myParameter]

Here se puede encontrar una buena guía para principiantes de Apple

1

Si no desea utilizar instancias de SomeScript ... puede seguir un enfoque diferente. Use NSNotificationCenter para enviar una notificación a su objeto SomeScript y haga que ejecute un selector después de eso.

En su - método (void) {} ​​awakeFromNib, desde SomeScript coloque el código siguiente:

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

crear el método "mySelector:" y colocar la la llamada a su método loggedin. (O si lo prefiere, puede sustituir "mySelector:" con loggedin directamente)

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

Entonces no olvide quitar el observador dealloc, así que coloque el siguiente fragmento de código en su clase SomeScript también:

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

entonces usted puede enviar una notificación de cualquier otro modo:

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

Esa última pieza de código envía una notificación a SomeScript y se ejecuta el selector.

Espero que les ayude chicos!

1

podemos decir que es como [self loggedIn]
Cuando método loggedin está en SomeScript clase, usando la sintaxis simples en última Xcode.

[[SomeScript new] loggedIn]; 
+0

¿Esto requiere desasignación después? Supongo que no hay manera de ... – durazno

+1

con ARC no se requiere desasignación. –

Cuestiones relacionadas