Domanda Blocca riferimenti come vars di istanza in Objective-C


Mi stavo chiedendo se è possibile memorizzare un riferimento a una funzione anonima (blocco) come una variabile di istanza in Objective-C.

So come usare la delega, l'azione mirata, ecc. Non sto parlando di questo.


44
2017-07-12 16:30


origine


risposte:


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];

86
2017-07-12 16:46



Sì, puoi sicuramente 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 vuoto:

typedef void (^MyActionBlockType)(id);

@interface MyClass : NSObject 
{

}

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

farà il trucco.


12
2017-07-12 16:47