block 的使用

Block 是iOS在4.0之后新增的程式语法,一般用于回调方法,功能上和delegate类似。本文将讲解block的几种常见的使用方法,当然,block中最值得注意的还是它的内存管理,可能会在以后提到。

环境信息:

Mac OS X 10.9.5

Xcode 5.1.1

IOS 7.1

正文:

为什么要使用block?

  1. 可代替delegate完成回调,而不需要像delegate那样繁琐

  2. 在某些方面,可代替selector(如NSNotificationCenter在addObserver的时候,可以使用block,而不用单独定义方法)

  3. 延长对象的生命周期(block会自动持有对象,这将在《》中讲到)

  4. 提高代码的复用性和可读性

block结构

block的结构和C语言的函数指针结构类似,只是将函数指针的*换成了^

block结构示意图
block结构示意图

如何使用?

一、直接在方法中定义

1. 无返回值无参数

定义:


void (^block) (void);

赋值:


block = ^{

    NSLog(@"block的内容");
};

调用:


block();

2. 有返回值有参数

定义:


int (^block)(int a);

赋值:


int (^block)(int a) = ^int(int a) {

    return a > 0 ? a : -a;
};

调用:


NSLog(@"%d", block(-10));

二、将block定义为属性

定义:


@property (nonatomic, copy) int (^block)(int a);

赋值:


Class *object = [[Class alloc] init];
object.block = ^int (int a, int b) {

    return a > b ? a : b;
};

调用:

调用将会在Class内部进行,所以这里使用到的self是指上面的object对象。调用之前,最好先判断对象是否给block赋值,如果block为nil,调用block会导致程序崩溃。


if (_block) {

    self.block(10);
}

三、在方法中将block作为参数传入

着这种用法中,我们通常会使用typedef为block取一个别名

定义:


typedef void(^Block)(int a);
- (void)nslogParameterWithBlock:(Block)block {

    if (block) {
        block(10);
    }
}

赋值并调用:


[object nslogParameterWithBlock:^(int a) {  
    
     NSLog(@"%d", a);
}];

总结:

block使用方便,在项目中,合适的使用block也是你的代码看起来高端大气上档次,但是block的内存管理确实是一项非常重要也非常容易出错的地方,稍不注意便会造成内存泄露,所以,在使用block的时候,也要小心。

 

发表评论

电子邮件地址不会被公开。