2011-02-01 11 views
6

¿Alguna idea de por qué esto no funciona?performSelector: withObject: afterDelay from class method not working

[self performSelector:@selector(foo:) withObject:argObj afterDelay:5.0]; 

Estoy llamando desde dentro de un método de clase, y se llama a otro método de clase de la misma clase (por lo tanto 'yo'). Es esto valido?

Coloqué un punto de interrupción en foo, pero no se llama. ¿Que está pasando aqui?

+4

Debería estar funcionando. ¿Puedes publicar la definición de método de foo: y el método que eres? ¿Estás en el hilo principal? – seppo0010

Respuesta

7

¿Tiene un bucle de ejecución ejecutándose en el hilo desde el que invoca el perform:afterDelay:? Si no, no se ejecutará.

+0

Este era el problema. Nunca había oído hablar de ese requisito. Gracias. –

+1

Si su código está rodeado por un grupo de liberación automática que lo matará. –

+0

¿puede por favor elaborar cómo llevar a cabo la cosa? sentirse como tonto :( – harshitgupta

-1

Tal vez esté malinterpretando su pregunta, pero ¿por qué está usando la palabra clave self en un contexto estático en primer lugar? ¿Por qué no simplemente cambiar self al nombre de la clase?

+8

Porque el contexto no es estático. 'self' puede ser la clase, o puede ser cualquier subclase de la clase (o cualquier subclase de esas, etc.). Al igual que "self" en un método de instancia no siempre es una instancia de la clase, a veces es una instancia de la subclase u otro descendiente. –

+1

Ah, muy bueno saberlo. Anteriormente había supuesto que 'yo' en Objective-C era similar a 'esto' en Java, que no se puede usar en un contexto estático. Gracias por la aclaración. –

+4

En Obj-C, las clases en sí mismas son objetos. Los métodos de clase son, literalmente, solo métodos de instancia en la metaclase (la metaclase es básicamente la clase de la clase). Los métodos de clase se llaman exactamente de la misma manera que los métodos de instancia, la única diferencia es que el método se busca en la metaclase en lugar de en la clase. Esto significa que 'self' funciona en los métodos de clase exactamente de la misma manera que en los métodos de instancia. –

-1
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay 

The method es un método de instancia, el receptor debe ser una instancia de la clase. Necesita un objeto concreto para realizar la acción. Así que no creo que funcione en el método de clase.

+1

performSelector funciona con un método class + class (confirmado en 10.6). Entonces tu problema está en otra parte. – CRD

+1

Las clases son solo instancias de la metaclase. Debería funcionar bien. – bbum

Cuestiones relacionadas