首页 > 代码库 > 黑马程序员-2.block块

黑马程序员-2.block块

吐槽:刚开始接触iOS的时候真的挺不适应的,里面出现了很多新玩意,不过还好我比较喜欢新鲜事物,以后整理些iOS中比较新颖的东西。

    block就是一个,不过有了block之后省去了上下翻代码的麻烦,很好用,推荐!!

    

1.Block定义

Block是OC中的一种数据类型,在iOS开发中被广泛使用

^是Block的特有标记,Block的实现代码包含在{}之间

大多情况下,以内联inline函数的方式被定义和使用

Block与C语言的函数指针有些相似,但使用起来更加灵活

示例

void(^demoBlock)() = ^ {
    NSLog(@"demo Block");
};
int(^sumBlock)(int, int) = ^(int x, int y) {
    return x + y;
};

格式说明:

(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现};

如果没有参数,等号后面参数列表的()可以省略


2.当作参数传递

NSArray *array = @[@"刘", @"李", @"张", @"杨"];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"第 %d 项内容是 %@", (int)idx, obj);
    if ([@"李" isEqualToString:obj]) {
        *stop = YES;
    }
}];

遍历并NSLog() array中的内容,当obj 为"李"时停止遍历

//函数原型
enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {        *stop = YES;
}];



3.局部变量

int z=10;
int(^sumBlock)(int, int) = ^(int x, int y) {
    z=10;   //报错
    return x + y +z;  
};

原因:在block外部的变量,在block中是只读的

解决办法:在变量前加  __block 关键字 


4.传递对象

NSString *name=@"李";
NSArray *array = @[@"刘", @"李", @"张", @"杨"];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"第 %d 项内容是 %@", (int)idx, obj);
    if ([name isEqualToString:obj]) {
        *stop = YES;
    }
}];

把name传给block块,Block块会自动对指针进行强引用


5.typedef

使用typedef改写官方的数组便利函数

官方的数组遍历方法声明如下:
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block;


而如果使用typedef,则需要:
typedef void(^EnumerateBlock)(id obj, NSUInteger idx, BOOL *stop);

使用时直接写:
- (void)enumerateObjectsUsingBlock:(EnumerateBlock)block;


黑马程序员-2.block块