2010-07-12 8 views

Respuesta

86

Sure.

typedef void(^MyCustomBlockType)(void); 

@interface MyCustomObject { 
    MyCustomBlockType block; 
} 
@property (nonatomic, copy) MyCustomBlockType block; //note: this has to be copy, not retain 
- (void) executeBlock; 
@end 

@implementation MyCustomObject 
@synthesize block; 

- (void) executeBlock { 
    if (block != nil) { 
    block(); 
    } 
} 

- (void) dealloc { 
    [block release]; 
    [super dealloc]; 
} 
@end 

//elsewhere: 

MyCustomObject * object = [[MyCustomObject alloc] init]; 
[object setBlock:^{ 
    NSLog(@"hello, world!"); 
}]; 

[object executeBlock]; 
[object release]; 
+0

¿hay alguna manera de tener un tipo genérico para un bloque? Odio que necesito tener un 'typedef' allí. –

+3

@Jacob, sí, puedes hacer: 'void (^) (void)' (o la firma de bloque que necesites) donde sea que veas 'MyCustomBlockType'. Sin embargo, * prometo * que el uso de 'typedef' hará las cosas mucho más fáciles de asimilar en el largo plazo. Sin embargo, no hay forma de decir "ningún bloque con ningún valor de retorno ni ningún parámetro. Debe ser explícito sobre la firma." –

+3

@Jacob Todavía está limitado por el sistema de tipos de C. No existe el bloque "genérico". , aunque en C++ es posible que puedas hacer algunas cosas alucinantes con plantillas y bloques. Más realistamente, escribe 'id' es genérico con respecto a los tipos Objective-C, por lo que toma y devuelve (posiblemente nulo)' id' s te da mucha flexibilidad. –

12

Sí, ciertamente puede almacenar una referencia a una (copia) de un bloque Objective-C. La declaración de la variable es un poco peluda, como los punteros de función C, pero más allá de eso no es problema. Para un bloque que lleva y id y devuelve void:

typedef void (^MyActionBlockType)(id); 

@interface MyClass : NSObject 
{ 

} 

@property (readwrite,nonatomic,copy) MyActionBlockType myActionBlock; 
@end 

hará el truco.

+3

La definición es definitivamente peluda. Yo * mucho * prefiero usar 'typedef' para simplemente si. Entonces puede hacer cosas locas "bloques que aceptan un bloque como parámetro y devolver un bloque" y no perderse entre paréntesis. :) –

+0

Muy buen punto, Dave. –

+0

es este 'typedef void (^ MyActionBlockType) (id);' correcto? no debería ser 'typedef void (^ MyActionBlockType) (id obj);' – SpaceDog

Cuestiones relacionadas