Objective-C 块(Blocks)

Objective-C 类定义了一个将数据与相关行为相结合的对象。有时只表示单个任务或行为单元,而不是一组方法。

块(Blocks)是添加到 C、Objective-C 和 C++ 中的语言级功能,它可以让您创建不同的代码段,这些代码段可以像传递值一样传递给方法或函数。块是 Objective-C 对象,这意味着它们可以添加到 NSArray 或 NSDictionary 之类的集合中。

它们还能够从封闭范围中捕获值,使其类似于其他编程语言中的闭包或 lambda


简单块声明语法

简单块实现

  1. returntype (^blockName)(argumentType)= ^{
  2. };

这里有一个简单的例子

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

然后调用

  1. simpleBlock();

块接受参数并返回值

块也可以像方法和函数一样接受参数和返回值。

下面是一个简单的实例,用于实现和调用具有参数和返回值的块。

  1. double (^multiplyTwoValues)(double, double) =
  2. ^(double firstValue, double secondValue) {
  3. return firstValue * secondValue;
  4. };
  5. double result = multiplyTwoValues(2,4);
  6. NSLog(@"The result is %f", result);

使用类型定义的块

下面是一个在块中使用 typedef 的简单实例。请注意,此实例暂时 无法联机编译器 上运行。使用 XCode 运行相同的。

  1. #import <Foundation/Foundation.h>
  2. typedef void (^CompletionBlock)();
  3. @interface SampleClass:NSObject
  4. - (void)performActionWithCompletion:(CompletionBlock)completionBlock;
  5. @end
  6. @implementation SampleClass
  7. - (void)performActionWithCompletion:(CompletionBlock)completionBlock {
  8. NSLog(@"Action Performed");
  9. completionBlock();
  10. }
  11. @end
  12. int main() {
  13. /* my first program in Objective-C */
  14. SampleClass *sampleClass = [[SampleClass alloc]init];
  15. [sampleClass performActionWithCompletion:^{
  16. NSLog(@"Completion is called to intimate action is performed.");
  17. }];
  18. return 0;
  19. }

结果如下:

  1. 2022-07-10 08:13:57.155 demo[284:303] Action Performed
  2. 2022-07-10 08:13:57.157 demo[284:303] Completion is called to intimate action is performed.

块在 iOS 应用程序和 Mac OS X 中使用较多。因此,了解块的使用更为重要。