2010-07-12 17 views

risposta

86

Sicuro.

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

c'è un modo per avere un tipo generico per un blocco? Odio che ho bisogno di avere un typedef lì. –

+3

@Jacob si, puoi fare: 'void (^) (void)' (o qualsiasi altra firma di blocco che ti serve) ovunque vedi 'MyCustomBlockType'. Tuttavia, * prometto * che l'uso di 'typedef' renderà le cose molto più facili da far durare nel lungo periodo. Tuttavia, non c'è modo di dire "qualsiasi blocco con qualsiasi valore di ritorno e qualsiasi parametro." Devi essere esplicito sulla firma –

+3

@Jacob Sei ancora limitato dal sistema di tipo C. Non esiste un blocco "generico" , anche se in C++ potresti essere in grado di fare cose piuttosto ingegnose con modelli e blocchi. Più realisticamente, digitare 'id' è generico rispetto ai tipi Objective-C, quindi prendere e restituire (eventualmente nil)' id' ' s ti dà un sacco di flessibilità –

12

Sì, è sicuramente possibile memorizzare un riferimento a una (copia) di un blocco Objective-C. La dichiarazione delle variabili è un po 'pelosa, come i puntatori di funzione C, ma oltre a ciò non c'è problema. Per un blocco che prende e id e restituisce void:

typedef void (^MyActionBlockType)(id); 

@interface MyClass : NSObject 
{ 

} 

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

farà il trucco.

+3

La definizione è decisamente pelosa. Io * molto * preferisco usare 'typedef' per semplicemente se. Quindi puoi fare cose folli "blocchi che accettano un blocco come parametro e restituire un blocco" e non perdersi tra parentesi. :) –

+0

Ottimo punto, Dave. –

+0

è questo 'typedef void (^ MyActionBlockType) (id);' corretto? non dovrebbe essere 'typedef void (^ MyActionBlockType) (id obj);' – SpaceDog

Problemi correlati