Blocks Programming Topics

Getting Started with Blocks

Declaring and Using a Block

使用^操作符来声明一个block变量并且指明了block的开始。body在{}中如下的例子:

int multiplier = 7;

int (^myBlock)(int) = ^(int num) {

return num * multiplier;
};
};

例子解释如下:

你可以看到block body中可以访问 {}和自己是同一个scope的变量。

如果你将block声明为一个变量,那么你可以像函数一样使用它,例如:

  int multiplier = 7;
  int (^myBlock)(int) = ^(int num) {
      return num * multiplier;
  };
  printf("%d", myBlock(3));
//prints "21"

Using a Block Directly

许多情况下你不需要声明block变量,而是简单写block inline作为参数。如下的例子使用qsort_b函数。qsort_b和标准的qsort_r函数很类似,但是将block作为了参数。

char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };
qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
    char *left = *(char **)l;
    char *right = *(char **)r;
    return strncmp(left, right, 1);

});

// myCharacters is now { "Charles Condomine", "George", "TomJohn" }

Blocks with Cocoa

如下的例子展示的就是如何使用block和nsarray方法sortedArrayUsingComparator:这个方法有一个block的参数。为了说明,这里将block定义成了NSComparator local 变量。

NSArray *stringsArray = @[ @"string 1",
                             @"String 21",
                             @"string 12",
                             @"String 11",
                             @"String 02" ];
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch |
  NSNumericSearch |
          NSWidthInsensitiveSearch | NSForcedOrderingSearch;
  NSLocale *currentLocale = [NSLocale currentLocale];
  NSComparator finderSortBlock = ^(id string1, id string2) {
      NSRange string1Range = NSMakeRange(0, [string1 length]);
      return [string1 compare:string2 options:comparisonOptions range:string1Range
  locale:currentLocale];

};

NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock]; NSLog(@"finderSortArray: %@", finderSortArray);

  /*
  Output:
  finderSortArray: (
      "string 1",
      "String 02",
      "String 11",
      "string 12",
      "String 21"

) */

__block Variables

__block类型就说明了这个变量在block body中可以被改变。

  NSArray *stringsArray = @[ @"string 1",
@"String 21", // <-
@"string 12",
@"String 11",
@"Str?ng 21", // <-
@"Stri?g 21", // <-
@"String 02" ];
NSLocale *currentLocale = [NSLocale currentLocale];
__block NSUInteger orderedSameCount = 0;
NSArray *diacriticInsensitiveSortArray = [stringsArray
sortedArrayUsingComparator:^(id string1, id string2) {
    NSRange string1Range = NSMakeRange(0, [string1 length]);
    NSComparisonResult comparisonResult = [string1 compare:string2
options:NSDiacriticInsensitiveSearch range:string1Range locale:currentLocale];
    if (comparisonResult == NSOrderedSame) {
        orderedSameCount++;

}

    return comparisonResult;
}];
NSLog(@"diacriticInsensitiveSortArray: %@", diacriticInsensitiveSortArray);
NSLog(@"orderedSameCount: %d", orderedSameCount);

/* Output:

diacriticInsensitiveSortArray: (
    "String 02",
"string 1",
"String 11",
"string 12",
"String 21",

"Str\U00eeng 21",
      "Stri\U00f1g 21"
  )
  orderedSameCount: 2
  */

Conceptual Overview

Block Functionality

  • block 是一个匿名的code的inline collection
  • 有一个类似function的类型参数
  • 有一个返回类型
  • 可以捕获它定义范围内的状态
  • 可以有选择的改变定义范围内的状态
  • 可以在定义范围销毁后继续共享和改变定义状态

Usage

blocks代表了小规模的,自容的代码片段。它们在执行并发的任务时作为封装单元尤其重要。block有别于传统callback函数的优点是:

1,它们允许你在方法执行后的某一个调用的地方书写代码

2,它们允许访问本地变量

Declaring and Creating Blocks

Declaring a Block Reference

void (^blockReturningVoidWithVoidArgument)(void);

int (^blockReturningIntWithIntAndCharArguments)(int, char);

void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int);

没有返回类型的block必须显示表明为void类型

你也可以创建block类型当你在多个地方使用特定的signature

typedef float (^MyBlockType)(float, float);
MyBlockType myFirstBlock = // ... ;
MyBlockType mySecondBlock = // ... ;

Creating a Block

以下的例子定义了一个简单的block然后分配给了一个之前声明的变量oneFrom。

float (^oneFrom)(float);
oneFrom = ^(float aFloat) {
    float result = aFloat - 1.0;
    return result;

};

Global Blocks

#import <stdio.h>
int GlobalInt = 0;
int (^getGlobalInt)(void) = ^{ return GlobalInt; };

Blocks and Variables

5中类型的变量

  • global variables, including static locals
  • global functions
  • local variables and parameters form an enclosing scope
  • __block varibales
  • const improts

Object and Block Variables

Objective-C Objects

当copy一个block时,它会创建一个object变量的强引用。如果你在一个执行方法中说使用block:

如果你通过引用来访问一个实例变量,就会产生self的强引用

如果你通过值来访问一个实例变量,就会产生这个变量的强引用

dispatch_async(queue, ^{
      // instanceVariable is used by reference, a strong reference is made to self
      doSomethingWithObject(instanceVariable);

});

  id localVariable = instanceVariable;
  dispatch_async(queue, ^{
      /*
        localVariable is used by value, a strong reference is made to localVariable
        (and not to self).

*/

      doSomethingWithObject(localVariable);
  });

Using Blocks

Invoking a Block

如果你将block声明为变量,你可以在函数中使用它,例如:

int (^oneFrom)(int) = ^(int anInt) {
    return anInt - 1;

};

printf("1 from 10 is %d", oneFrom(10));
// Prints "1 from 10 is 9"
float (^distanceTraveled)(float, float, float) =
                         ^(float startingSpeed, float acceleration, float time) {
    float distance = (startingSpeed * time) + (0.5 * acceleration * time * time);
    return distance;
};
float howFar = distanceTraveled(0.0, 9.8, 1.0);
// howFar = 4.9

Using a Block as a Function Argument

你可以

时间: 2024-10-16 13:18:57

Blocks Programming Topics的相关文章

Programming with Objective-C 学习笔记

这几天把Programming with Objective-C再看了一边,发现有很多以前不明确的地方.现在把一些重要的点记下来,巩固学习效果. 1.Objective-C Classes Are also Objects(OC类也是对象) In Objective-C, a class is itself an object with an opaque type called Class. Classes can't have properties defined using the dec

[POC] Working with Blocks

An Objective-C class defines an object that combines data with related behavior. Sometimes, it makes sense just to represent a single task or unit of behavior, rather than a collection of methods. Blocks are a language-level feature added to C, Objec

Block、委托、回调函数原理剖析(在Object C语境)——这样讲还不懂,根本不可能!

开篇:要想理解Block和委托,最快的方法是搞明白“回调函数”这个概念. 做为初级选手,我们把Block.委托.回调函数,视为同一原理的三种不同名称.也就是说,现在,我们把这三个名词当成一回事.在这篇文章内,Block就是回调函数,委托也是回调函数,不再作详细的区分了.OK,Action! 那么,什么是回调函数?“回调”概念的主语是谁? 举个栗子(伪代码): 首先有个类,我们姑且称之为A类吧. A.h 文件 //声明回调函数:给指定的员工发放工资 -(void)paySalaryForStaff

Block(Closure) Tips

使用 Block 的时候谨记以下几点: 1.Block类型:全局块(Global Block)和堆块(Heap Block),以及栈块(Stack Block).2.变量捕获: 默认无法修改变量,需要添加 __block 修饰符3.避免循环引用. 推荐文章:1.官方文档:快速上手:Working with Blocks,进阶:Blocks Programming Topics2.优秀博客:Deep into Block: A look inside blocks: Episode 1, Epis

iOS开发官方文档汇总

程序员的学习过程是无止境的,程序员学习的途径是多样的.可以从视频教程中领悟,也可以从他人的代码中 理解.但当我们专注于某一个平台在开发的时候,对于某个API使用或者功能实现有疑问,通常简单的测试可以让我们知道可能的效果,异或网上搜索一下别人的 经验,不过最好的途径应该还是阅读官方的文档解释.常常可以更全面,具体的了解.当然也不排除有时候官方文档说了跟没说似地,或者根本说得文不对题. 半年多里一直从事Mobile游戏的开发,Android和iOS平台都有接触,不过还是以iOS为主,为了解决问题也查

iOS多线程编程Part 3/3 - GCD

前两部分介绍了NSThread.NSRunLoop和NSOperation,本文聊聊2011年WWDC时推出的神器GCD.GCD: Grand Central Dispatch,是一组用于实现并发编程的C接口.GCD是基于Objective-C的Block特性开发的,基本业务逻辑和NSOperation很像,都是将工作添加到一个队列,由系统来负责线程的生成和调度.由于是直接使用Block,因此比NSOperation子类使用起来更方便,大大降低了多线程开发的门槛.另外,GCD是开源的喔:libd

Block声明

一个Objective-c类定义了一个对象结合数据相关的行为.有时候,这使得他有意义的表达单个任务或者单元的行为.而不是集合的方法. blocks是语言的特性,我们可以在C C++ 和Objective-c看到,这允许你创建不同的代码片段,这代码片段可以通过在方法或者函数里调用如果他们有值.blocks是Objective-c的对象,意味着他们可以被添加到集合像数组和字典里.他们也有能力扑捉封闭范围值. 这章我们阐述怎么声明和引用blocks的语法,和展示怎么用块语法来简化我们通常的任务例如集合

iOS 开发文档地址

程序员的学习过程是无止境的,程序员学习的途径是多样的.可以从视频教程中领悟,也可以从他人的代码中理解.但当我们专注于某一个平台在开发的时候,对于某个API使用或者功能实现有疑问,通常简单的测试可以让我们知道可能的效果,异或网上搜索一下别人的经验,不过最好的途径应该还是阅读官方的文档解释.常常可以更全面,具体的了解.当然也不排除有时候官方文档说了跟没说似地,或者根本说得文不对题. 半年多里一直从事Mobile游戏的开发,Android和iOS平台都有接触,不过还是以iOS为主,为了解决问题也查阅了

Creating a Timer

[Creating a Timer] Even if you specify a leeway value of 0, you should never expect a timer to fire at the exact nanosecond you requested. The system does its best to accommodate your needs but cannot guarantee exact firing times. When a computer goe