Блоки Objective-C

Класс Objective-C определяет объект, который объединяет данные со связанным поведением. Иногда имеет смысл просто представить одну задачу или единицу поведения, а не набор методов.

Блоки - это функция уровня языка, добавленная в C, Objective-C и C ++, которая позволяет создавать отдельные сегменты кода, которые можно передавать методам или функциям, как если бы они были значениями. Блоки - это объекты Objective-C, что означает, что они могут быть добавлены в коллекции, такие как NSArray или NSDictionary. Они также могут захватывать значения из окружающей области, делая их похожими на замыкания или лямбды в других языках программирования.

Синтаксис объявления простого блока

returntype (^blockName)(argumentType);

Простая блочная реализация

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

Вот простой пример

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

Мы можем вызвать блок, используя

simpleBlock();

Блоки принимают аргументы и возвращают значения

Блоки также могут принимать аргументы и возвращать значения точно так же, как методы и функции.

Вот простой пример реализации и вызова блока с аргументами и возвращаемыми значениями.

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

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

Блоки, использующие определения типов

Вот простой пример использования typedef в блоке. Обратите внимание на этот образецdoesn't work на online compilerтеперь. ИспользоватьXCode запустить то же самое.

#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;
}

Давайте скомпилируем и выполним его, он даст следующий результат -

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.

Блоки больше используются в приложениях iOS и Mac OS X. Поэтому более важно понимать использование блоков.