Objective-C基础笔记(6)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;
//使用__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);
Objective-C基础笔记(6)Block的更多相关文章
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 | 被围观 25,969 views+ 1.Anno ...
- php代码审计基础笔记
出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 --------------------------- ...
- MYSQL基础笔记(六)- 数据类型一
数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...
- MYSQL基础笔记(五)- 练习作业:站点统计练习
作业:站点统计 1.将用户的访问信息记录到文件中,独占一行,记录IP地址 <?php //站点统计 header('Content-type:text/html;charset=utf-8'); ...
- MYSQL基础笔记(四)-数据基本操作
数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...
- MYSQL基础笔记(三)-表操作基础
数据表的操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段n 数据类型 --最后一行不需要加逗号 ...
- MYSQL基础笔记(二)-SQL基本操作
SQL基本操作 基本操作:CRUD,增删改查 将SQL的基本操作根据操作对象进行分类: 1.库操作 2.表操作 3.数据操作 库操作: 对数据库的增删改查 新增数据库: 基本语法: Create da ...
- MYSQL基础笔记(一)
关系型数据库概念: 1.什么是关系型数据库? 关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 关系模型包含三个方面: 1.数据结构:数据存储的问题,二 ...
- JavaScript基础笔记二
一.函数返回值1.什么是函数返回值 函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...
- JavaScript基础笔记一
一.真假判断 真的:true.非零数字.非空字符串.非空对象 假的:false.数字零.空字符串.空对象.undefined 例: if(0){ alert(1) }else{ alert(2) } ...
随机推荐
- 前端AI切图技巧
AI的基本使用 1.选中多个不同图层. 首先在AI右边工具栏找到“图层” 然后选择需要切图的图层(按住“ctrl”点击) 最后拖到PS里面的新建的图层. 还有个问题,就是图层关联太多,无法拖动某些图层 ...
- python-高级编程-01
[1] 列表推导 问题 我们需要一个[2,4,6,8] 这样的列表 传统写法 res = [] for i in range(10): if i %2 == 0:res.append(i) print ...
- RIP 路由协议
RIP动态路由选择协议 routing information protocol IGP 小范围 路由器限制为15台 超过可能无法收敛 收敛概念 在一个域内 各个路由器知道各 ...
- js多少时间之前
<?php $time = time()*1000; $end_time = strtotime("2018-01-01")*1000; $time_ago = $time ...
- [LOJ#515]「LibreOJ β Round #2」贪心只能过样例
[LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...
- BZOJ4817 [Sdoi2017]树点涂色 【LCT + 线段树】
题目 Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色.Bob可能会进行这 ...
- 刷题总结——String painter(hdu2476)
题目: Problem Description There are two strings A and B with equal length. Both strings are made up of ...
- 北京集训TEST13——PA(第k小数)
题目: Description [问题描述] 从n个数中选若干(至少1)个数求和,求所有方案中第k小的和(和相同但取法不同的视为不同方案).[输入格式] 第一行输入2个正整数n,k. 第二 ...
- mybatis学习(五)——增删改查及自增主键的获取
一.mybatis的增删改查 1.修改hotelMapper接口 package com.pjf.mybatis.dao; import com.pjf.mybatis.po.Hotel; publi ...
- 学习struts2及MVC
1.MVC模式基础 1.1.MVC模式简介 MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而达到更好的开发和维护效率.在MVC模式中 ...