2011-06-29 14 views
9

que tengo:¿Usar un objeto de bloque en lugar de un selector?

[self schedule:@selector(tickhealth)]; 

y el método tickHealth sólo tiene una línea de código:

-(void)tickHealth 
{ 
    [hm decreaseBars:0.5]; 
} 

es posible el uso de objetos de bloque en lugar de un selector. por ejemplo, algo como:

[self schedule:^{ 
    [hm decreaseBars:0.5]; 
}]; 

Respuesta

7

Como Caleb & bbum señaló correctamente que no se puede pasar simplemente un bloque a su - (void)schedule:(SEL)selector; método existente (y sin cambios).

Sin embargo, puede hacer esto:

Definir tipo de bloque:

typedef void(^ScheduleBlock)(); 

Cambio schedule: método que se define similar a esto:

- (void)schedule:(ScheduleBlock)block { 
    //blocks get created on the stack, thus we need to declare ownership explicitly: 
    ScheduleBlock myBlock = [[block copy] autorelease]; 
    //... 
    myBlock(); 
} 

A continuación, llame así:

[self schedule:^{ 
    [hm decreaseBars:0.5]; 
}]; 

Además de Objective-C bondad bloque compilado por Mike Ash que le conseguirá kickstarted con bloques:

+0

Este método y el método de OP son incompatibles; un SEL no es lo mismo que un bloque. – bbum

+0

@bbum: Correcto, por eso escribí "Definir' schedule: 'método similar a esto: ...". Debería haber escrito "redefinir" para mayor claridad, tal vez. Corregido – Regexident

4

No se puede pasar un bloque en lugar de un selector porque esas dos cosas tienen diferentes tipos. Sin embargo, si tiene control sobre el método -schedule:, puede modificarlo fácilmente para aceptar y usar un bloque en lugar de un selector.

Cuestiones relacionadas