标签:objective-c block
Block(代码段)封装了一段代码,可以在任何时候执行。
Block可以作为函数参数或者函数返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline(内联函数)的,并且默认情况下它对局部变量是只读的。
苹果官方建议尽量多用block.在多线程、异步任务、集合遍历、集合排序、动画转场用的很多。
Block的定义:
int (^MySum) (int, int) = ^(int a, int b){
return a + b;
}
定义了一个叫MySum的block对象,它带有两个int参数,返回int类型,等号右边是block的具体实现。
void test(){
    //定义了一个block,这个block返回值是int类型,接收两个int类型参数
    int (^Sum) (int, int) = ^(int a, int b){
        return a + b;
    };
    
    int a = Sum(10, 11);
    
    NSLog(@"%i", a);
}void test2(){
    //block可以访问局部变量,但默认情况下不能修改
    int c = 15;
    //使用__block关键字,变量可以在block中修改
    __block int b = 25;
    
    MySum sum = ^(int a, int b){
        NSLog(@"C is %i", c);
        b = 35;
        NSLog(@"B is %i", b);
        return a + b;
    };
    
    NSLog(@"%i", sum(10, 10));
}在上一篇中我们实现了一个按钮监听器,这一篇我们使用block来实现按钮监听器。#import <Foundation/Foundation.h> @class Button; typedef void (^ButtonBlock) (Button *); @interface Button : NSObject //这里暂时用assign @property (nonatomic, assign) ButtonBlock block; //模拟按钮点击 - (void)click; @end在Button.h中我们定义了一个数据类型 void(^ButtonBlock) (Button *), 然后定义一个该类型的成员变量 ButtonBlock block;
添加了一个成员方法 - (void)click;
#import "Button.h"
@implementation Button
- (void)click {
    _block(self);
}
@end
Button.m文件中实现了 - (void)click方法int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Button *btn = [[[Button alloc] init] autorelease];
        
        btn.block = ^(Button *btn){
            NSLog(@"按钮%@被点击了", btn);
        };
        //模拟按钮点击
        [btn click];
    }
    return 0;
}最后在主函数中我们先获取按钮对象,然后给按钮对象中的block对象赋值,最后在模拟按钮点击事件的触发。细心的朋友可能会发现,这里定义的block和c语言中的指向函数的指针特别想,两个对比如下:
int sum1(int a, int b){
    return a + b;
}
void test3(){
    
    //Block
    int(^sum)(int, int) = ^(int a, int b){
        return a + b;
    };
    
    //指向函数的指针
    int (*sum1)(int, int) = sum1;
    
    //调用
    sum(11, 11);
    sum1(10, 10);
}typedef int(^MySum) (int, int); typedef int (*sum2)(int, int);
标签:objective-c block
原文地址:http://blog.csdn.net/dawanganban/article/details/41216165