iOS中Block介绍(一)基础

移动开发 iOS
ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发。讨论范围:block的使用,内存管理,内部实现。不包含的内容:gc arc下的block内存,block在c++中的使用。

一、概述

Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。

二、热身

先看一个比较简单的Block例子:

int multiplier = 7; 
int (^myBlock)(int) = ^(int num) { 
    return num * multiplier; 
}; 
  • 1.
  • 2.
  • 3.
  • 4.

在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?

来,让我们typedef一下

typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block 
typedef int (^IntBlock)(void);//一个没有参数,返回int的block 
typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block 
  • 1.
  • 2.
  • 3.

三、更详细的例子

注意:上面的typedef都还有效~

主动调用一下:

- (void)someMethod 

    BoolBlock ablock = ^(BOOL bValue) { 
        NSLog(@"Bool block!"); 
    }; 
    ablock(); 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

作为参数返回:

typedef void (^BoolBlock)(BOOL); 
- (BoolBlock)foo() 

    BoolBlock ablock = ^(BOOL bValue) { 
        NSLog(@"Bool block!"); 
    }; 
    return [[ablock copy] autorelease];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

类的一个成员:

@interface OBJ1 : NSObject 
@property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们 
@end 
 
OBJ1 *obj1 = ... 
obj1.block = ^(BOOL bValue) { 
        NSLog(@"Bool block!"); 
    }; 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

其他函数的参数:

- (void)foo(BoolBlock block) 

    if (block) { 
        block(); 
    } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

甚至其他block的参数:

BoolBlock bBlock = ^(BOOL bV){if(Bv){/*do some thing*/}}; 
HugeBlock hBlock = ^(BoolBlock bB) {bB();}; 
 
hBolck(bBlock); 
  • 1.
  • 2.
  • 3.
  • 4.

啊,全局变量!:

static int(^maxIntBlock)(intint) = ^(int a, int b){return a>b?a:b;}; 
int main() 

    printf("%d\n", maxIntBlock(2,10));   
    return 0; 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

好了,你知道block大概能怎么用了。

四,特殊的标记,__block

如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:

int main() 

    __block int i = 1024; 
    BoolBlock bBlock = ^(BOOL bV) { 
        if (bV) { 
            i++;//如果没有__block标记,是无法通过编译的。 
        } 
    }; 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

好了,基础很快,更详细的内容将用来介绍深入的东西。

责任编辑:闫佳明 来源: dreamingwish
相关推荐

2013-07-19 14:35:59

iOS中BlockiOS开发学习

2013-07-19 14:00:13

iOS中BlockiOS开发学习

2013-07-19 13:16:26

iOS中BlockiOS开发学习内存管理

2011-08-08 18:11:45

IOS 4Block UIActionShe

2017-03-07 09:45:43

iOSBlock开发

2013-01-07 10:42:43

HDFS

2013-06-04 15:41:31

iOS开发移动开发block

2025-01-10 09:47:43

blockSDKiOS

2022-12-15 17:31:41

架构龙芯

2010-11-01 06:43:21

PowerShell

2013-03-27 10:32:53

iOS多线程原理runloop介绍GCD

2011-07-14 16:26:01

2010-03-05 10:24:33

2010-04-21 17:10:25

Unix信号量

2011-07-21 17:33:27

JAVA

2009-09-28 10:24:58

Hibernate基础

2022-12-06 23:43:53

iOSCreateML应用

2011-07-14 17:02:09

C++指针

2009-09-22 09:27:29

Hibernate P

2011-06-21 14:42:37

ECMAScriptJavaScript
点赞
收藏

51CTO技术栈公众号