首页 技术 正文
技术 2022年11月23日
0 收藏 793 点赞 2,932 浏览 1540 个字

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监听器。

Objective-C基础笔记(6)Block

#import <Foundation/Foundation.h>
@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);

微信扫一扫

支付宝扫一扫

本文网址:https://www.zhankr.net/140776.html

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:877 阅读:5,808
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:806 阅读:3,874
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:565 阅读:4,680
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:731 阅读:4,624
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:5,714
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:3,415
助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:8:00-16:00

客服电话

400-888-8888

客服邮箱

ceotheme@ceo.com

扫描二维码

关注微信公众号

扫描二维码

手机访问本站