博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C基础笔记(6)Block
阅读量:6892 次
发布时间:2019-06-27

本文共 1918 字,大约阅读时间需要 6 分钟。

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;    //使用__blockkeyword,变量能够在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));}
在上一篇中我们实现了一个button监听器。这一篇我们使用block来实现button监听器。

#import 
@class Button;typedef void (^ButtonBlock) (Button *);@interface Button : NSObject//这里临时用assign@property (nonatomic, assign) ButtonBlock block;//模拟button点击- (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(@"button%@被点击了", btn);        };        //模拟button点击        [btn click];    }    return 0;}
最后在主函数中我们先获取button对象,然后给button对象中的block对象赋值。最后在模拟button点击事件的触发。

细心的朋友可能会发现,这里定义的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);
你可能感兴趣的文章
XSS
查看>>
Java 线程学习
查看>>
acl_cpp 编程之 xml 流式解析与创建
查看>>
基于域的无线安全认证方案
查看>>
Thread类常用方法
查看>>
我的友情链接
查看>>
几乎所有编程语言的hello, world程序(3)
查看>>
CentOs 设置静态IP 方法
查看>>
Windows上Python2.7安装Scrapy过程
查看>>
学习记录:浏览器JAVASCRIPT里的WINDOWS,DOCUMNET
查看>>
Nginx内置变量以及日志格式变量参数详解
查看>>
Linux简单了解
查看>>
Importing Swift into Objective-C
查看>>
oracle merge同时包含增、删、改
查看>>
Docker 命令
查看>>
如何在andorid native layer中加log function.【转】
查看>>
创建以API为中心的Web应用(转)
查看>>
互动网计算机频道图书7日销售排行(05.12-05.19)
查看>>
POJ 3528 Ultimate Weapon(三维凸包表面积)
查看>>
Qt信号槽的一些事
查看>>