Blocos Objective-C

Uma classe Objective-C define um objeto que combina dados com comportamento relacionado. Às vezes, faz sentido representar apenas uma única tarefa ou unidade de comportamento, em vez de uma coleção de métodos.

Blocos são um recurso de nível de linguagem adicionado a C, Objective-C e C ++ que permitem criar segmentos distintos de código que podem ser passados ​​para métodos ou funções como se fossem valores. Blocos são objetos Objective-C, o que significa que podem ser adicionados a coleções como NSArray ou NSDictionary. Eles também têm a capacidade de capturar valores do escopo envolvente, tornando-os semelhantes a fechamentos ou lambdas em outras linguagens de programação

Sintaxe de declaração de bloco simples

returntype (^blockName)(argumentType);

Implementação de bloco simples

returntype (^blockName)(argumentType)= ^{
};

Aqui está um exemplo simples

void (^simpleBlock)(void) = ^{
   NSLog(@"This is a block");
};

Podemos invocar o bloco usando

simpleBlock();

Blocos recebem argumentos e valores de retorno

Os blocos também podem receber argumentos e valores de retorno, assim como métodos e funções.

Aqui está um exemplo simples para implementar e invocar um bloco com argumentos e valores de retorno.

double (^multiplyTwoValues)(double, double) = 
   ^(double firstValue, double secondValue) {
      return firstValue * secondValue;
   };

double result = multiplyTwoValues(2,4); 
NSLog(@"The result is %f", result);

Blocos usando definições de tipo

Aqui está um exemplo simples usando typedef em bloco. Observe este exemplodoesn't work no online compilerpor enquanto. UsarXCode para executar o mesmo.

#import <Foundation/Foundation.h>

typedef void (^CompletionBlock)();
@interface SampleClass:NSObject
- (void)performActionWithCompletion:(CompletionBlock)completionBlock;
@end

@implementation SampleClass

- (void)performActionWithCompletion:(CompletionBlock)completionBlock {

   NSLog(@"Action Performed");
   completionBlock();
}

@end

int main() {
   
   /* my first program in Objective-C */
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass performActionWithCompletion:^{
      NSLog(@"Completion is called to intimate action is performed.");
   }];

   return 0;
}

Vamos compilá-lo e executá-lo, ele produzirá o seguinte resultado -

2013-09-10 08:13:57.155 demo[284:303] Action Performed
2013-09-10 08:13:57.157 demo[284:303] Completion is called to intimate action is performed.

Blocos são mais usados ​​em aplicativos iOS e Mac OS X. Portanto, é mais importante entender o uso de blocos.