初识block
我们可以把Block当做Objective-C的匿名函数。Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观。另外,block的实现具有封闭性(closure),而又能
“”
本文转自破船的博客:
小引
Got Blocks。虽然之前也有接触过block,不过没有深入完整的学习过,借此机会来学习一下,顺便翻译几篇block相关的文章,本文是第一篇,算是block的入门。本文的最后延伸阅读给出了4篇相关文章,不出意外的话,本周大家能看到对应的中文版。
- // main.m
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[]) {
- @autoreleasepool {
- // Declare the block variable
- double (^distanceFromRateAndTime)(double rate, double time);
- // Create and assign the block
- distanceFromRateAndTime = ^double(double rate, double time) {
- return rate * time;
- };
- // Call the block
- double dx = distanceFromRateAndTime(35, 1.5);
- NSLog(@"A car driving 35 mph will travel "
- @"%.2f miles in 1.5 hours.", dx);
- }
- return 0;
- }
- double (^randomPercent)(void) = ^ {
- return (double)arc4random() / 4294967295;
- };
- NSLog(@"Gas tank is %.1f%% full",
- randomPercent() * 100);
- NSString *make = @"Honda";
- NSString *(^getFullCarName)(NSString *) = ^(NSString *model) {
- return [make stringByAppendingFormat:@" %@", model];
- };
- NSLog(@"%@", getFullCarName(@"Accord")); // Honda Accord

- NSString *make = @"Honda";
- NSString *(^getFullCarName)(NSString *) = ^(NSString *model) {
- return [make stringByAppendingFormat:@" %@", model];
- };
- NSLog(@"%@", getFullCarName(@"Accord")); // Honda Accord
- // Try changing the non-local variable (it won't change the block)
- make = @"Porsche";
- NSLog(@"%@", getFullCarName(@"911 Turbo")); // Honda 911 Turbo
- __block NSString *make = @"Honda";

local variable)类似,用__block修饰符声明的变量可以记录着block多次调用的结果。例如下面的代码创建了一个block,在block中对i进行累加。
- __block int i = 0;
- int (^count)(void) = ^ {
- i += 1;
- return i;
- };
- NSLog(@"%d", count()); // 1
- NSLog(@"%d", count()); // 2
- NSLog(@"%d", count()); // 3
- // Car.h
- #import <Foundation/Foundation.h>
- @interface Car : NSObject
- @property double odometer;
- - (void)driveForDuration:(double)duration
- withVariableSpeed:(double (^)(double time))speedFunction
- steps:(int)numSteps;
- @end
- // Car.m
- #import "Car.h"
- @implementation Car
- @synthesize odometer = _odometer;
- - (void)driveForDuration:(double)duration
- withVariableSpeed:(double (^)(double time))speedFunction
- steps:(int)numSteps {
- double dt = duration / numSteps;
- for (int i=1; i<=numSteps; i++) {
- _odometer += speedFunction(i*dt) * dt;
- }
- }
- @end
- // main.m
- #import <Foundation/Foundation.h>
- #import "Car.h"
- int main(int argc, const char * argv[]) {
- @autoreleasepool {
- Car *theCar = [[Car alloc] init];
- // Drive for awhile with constant speed of 5.0 m/s
- [theCar driveForDuration:10.0
- withVariableSpeed:^(double time) {
- return 5.0;
- } steps:100];
- NSLog(@"The car has now driven %.2f meters", theCar.odometer);
- // Start accelerating at a rate of 1.0 m/s^2
- [theCar driveForDuration:10.0
- withVariableSpeed:^(double time) {
- return time + 5.0;
- } steps:100];
- NSLog(@"The car has now driven %.2f meters", theCar.odometer);
- }
- return 0;
- }
- // Car.h
- #import <Foundation/Foundation.h>
- // Define a new type for the block
- typedef double (^SpeedFunction)(double);
- @interface Car : NSObject
- @property double odometer;
- - (void)driveForDuration:(double)duration
- withVariableSpeed:(SpeedFunction)speedFunction
- steps:(int)numSteps;
- @end
初识block的更多相关文章
- Block系列1:初识block
//-------1.定义函数----- //1.函数 int sum(int a,int b) { return a+b; } //------------------2.声明--------- / ...
- iOS开发技巧系列---使用链式编程和Block来实现UIAlertView
UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本 ...
- [Objective-C] Block实现回调和简单的学习思考
初识Block的时候,总觉得其很可怕,因为看不懂其运行原理,所以用起来总是觉得不安全.关于Block的语法,等我把手里的资料全部看完,整理好再发出来.这次先看看用Block怎么实现回调. 新博客:wo ...
- block的初识
block的介绍: Block是iOS4.0之后新增的一种语法结构,也称为“闭包(closure)”. SDK4.0新增的API大量使用了Block. Block是一个匿名的函数代码块,此代码 ...
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- Python自动化 【第十八篇】:JavaScript 正则表达式及Django初识
本节内容 JavaScript 正则表达式 Django初识 正则表达式 1.定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m ...
- 初识Hadoop入门介绍
初识hadoop入门介绍 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. < ...
- hadoop初识
搞什么东西之前,第一步是要知道What(是什么),然后是Why(为什么),最后才是How(怎么做).但很多开发的朋友在做了多年项目以后,都习惯是先How,然后What,最后才是Why,这样只会让自己变 ...
- IOS之UI -- UITableView -- 1 -- 相关初识
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
随机推荐
- java如何使用 tesseract 4.0.0-1.4.4
提示: 建议直接使用tess4j,tess4j是对tesseract的封装,使用更简单 首先引入依赖 <!-- https://mvnrepository.com/artifact/org.by ...
- Django orm的惰性机制
Django惰性机制 所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用Quer ...
- pycharm解决无法调用同文件夹下的文件
一.将所有的文件放在project这个根目录下面 二.添加一个空的__init__.py 文件 三.选中project根目录,点击右键选择make_directory as-->sources ...
- 洛谷P1313 [NOIP2011提高组Day2T1]计算系数
P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...
- 【模板】 递归线段树 [2017年五月计划 清北学堂51精英班Day4]
P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...
- Shell中字符串、数值的比较
原文:http://apps.hi.baidu.com/share/detail/31263915 在shell中字符串与数值的比较方法是不同的,要注意区分 整数比较: -eq 等于 ...
- 【python之路19】文件操作
一.打开文件 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r ...
- Qt: error lnk1158 无法运行rc.exe
解决办法:(依据自己的环境而定) 将C:\Program Files (x86)\Windows Kits\\bin\10.0.15063.0\x64 目录下的rc.exe 和rcdll.dll 复制 ...
- 批量删除maven lastUpdated
批量删除lastUpdated for /r %i in (*.lastUpdated) do del %i 安装jar到本地仓库 mvn install:install-file -Dfile=D: ...
- HTTP请求封装Java工具类
装载自:http://www.open-open.com/lib/view/open1384844838743.html package com.wiker; import java.io.Buffe ...