Objective-C基础笔记(6)Block
2024-09-29 11:46:33
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 <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);
最新文章
- PHP使用数据库的并发问题(转)
- Android的一种MVP模式框架
- mac下 codeigniter在apache下去掉index.php
- 在Visual C++下搭建OpenGL的开发环境
- 手机上的频段GSM GPRS分别是什么
- iOS:自定义工具栏、导航栏、标签栏
- yum -------包安装库
- 自动生成getter,setter方法的插件lombok
- Oracle SQL性能优化总结
- 03-在tomcat部署网站多个网站
- python configparse模块&;xml模块
- Latex 编辑数学公式——快速上手
- 漫谈C指针:参数传递的三道题目
- oracle在exp导出时报错PLS-00201: identifier &#39;EXFSYS.DBMS_EXPFIL_DEPASEXP&#39; must be declared
- Android O PackageInstaller 解析
- node.js学习笔记(二)——回调函数
- PBS命令和使用
- js修改input的type属性问题(兼容所有浏览器,主要用于密码类的默认有提示文字的效果)
- react之引用echarts
- advance shading——基础(辐射度测定)
热门文章
- python学习-- 数据库迁移 python manage.py makemigrations 和 python manage.py migrate
- iOS--app自定义相册--从自定义的相册中获取图片
- STL学习笔记(六) 函数对象
- poj 2724 Purifying Machine
- Windows PowerShell Exit Codes
- 快充 IC BQ25896 的 Dynamic Power Management
- CentOS找不到想要的镜像版本?
- LeetCode OJ-- Reverse Integer
- js拖拽效果的实现
- Codeforces 629 A. Far Relative’s Birthday Cake