iOS block
主要内容:
- block基本声明格式
 - block访问区域变量
 - block代替代理
 
block基本声明格式:
^(传入的参数){具体代码};
注: Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。
最简单的例子:
^(int a){return a*a};
简单调用例子:
int result = ^(int a){return a*a}(5);
NSLog(@"%d", result);
//好像这个例子没什么用,个人不知道这样写的意义在哪。
Block Pointer(Block指针)
//声明一个square的Block Pointer,其所指向的Block有一个int输入和int输出
int (^square)(int);
//将Block实体指定给square
square = ^(int a){ return a*a ; };
//调用方法,感觉是是不是很像function的用法?
int result = square(5);
NSLog(@"%d", result);
Block 还可以当作方法传给参数,如:
-(void)objcMethod:(int(^)(int))square;  //square参数的类型是int(^)(int)
存取变量:
在同一个代码块里面,Block是可以读取Block之外的变量的,如:
{
    int outN = 8;
    int (^myPtr)(int) = ^(int a){ return outN + a;};
    //block里面可以读取同一类型的outN的值
    int result = myPtr(3);  // result is 11
    NSLog(@"result=%d", result);
}
当变量为简单类型时,Block是直接copy当前变量的,而不是引用,如:
{
    int outN = 8;
    int (^myPtr)(int) = ^(int a){ return outN + a;};
    //block里面可以读取同一类型的outN的值
    //改变outN 的值
    outN = 5;
    int result = myPtr(3);  // result is 11
    NSLog(@"result=%d", result);
}
注:如果变量被static修饰过,会有一样的效果
当变量为指针时,如:
{
    NSMutableString string = [[NSMutableString alloc]initWithString:@"aaaa"];
    int (^myPtr)(int) = ^(int a){[string setString:@"changed!"] return a + a;};
    //block里面可以读取同一类型的outN的值
    int result = myPtr(3);  // result is 11
    NSLog(@"string =%@", string);// string =changed
}
Block variable(Block类型变量)
在某个变量前面如果加上修饰字“__block”的话(注意,block前面有两个下划线),这个变量就称作block variable。
那么在block里面就可以任意修改此变量的值,如:
{
    int outN = 8;
    int (^myPtr)(int) = ^(int a){ return outN+= a;};
    //block里面可以读取同一类型的outN的值
    int result = myPtr(3);  // result is 11
    NSLog(@"outN=%d", outN);  //outN=11
}
用Block代替代理
假如controller 的名字为: MyUIViewController
1).声明一个block(假设无返回值)
typedef void(^onSearch)(NSString *text);
2).在controller(事件触发源的地方)定义block
//定义成员属性
@property(nonatomic)onSearch onSearchBlock;
//添加setter方法
-(void)setOnSearchBlock:(void(^)(NSString *searchText)) block;
3).在对应的m文件里面实现setter方法
-(void)setOnSearchBlock:(void(^)(NSString *searchText)) block{
	if (block) {
		self.onSearchBlock = block;
	}
}
4)在controller 中使用block实现回调,如:
-(void)searchHandler:(id)sender {
       if (self.searchBlock) {
       			//这里传具体的参数,要查询的文本
                self.searchBlock(@"your search keyword")
        }
}
5)在其它地方,接收传过来的参数,如:
MyUIViewController *vc = [MyUIViewController new];
[vc setOnSearchBlock:^(NSString *searchText) {
         NSLog(@"get search keyword")
}]
注: 如果需要在block 里面调用self,则需要用weak 修饰避免整个类循环copy.如: __weak typeof(self) wself = self;
iOS block的更多相关文章
- iOS Block界面反向传值
		
在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C ...
 - iOS block从零开始
		
iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void ...
 - iOS block 机制
		
本文要将block的以下机制,并配合具体代码详细描述: block 与 外部变量 block 的存储域:栈块.堆块.全局块 定义 块与函数类似,只不过是直接定义在另一个函数里,和定义它的那个函数共享同 ...
 - ios Block详细用法
		
ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...
 - iOS Block的本质(四)
		
iOS Block的本质(四) 上一篇文章iOS Block的本质(三)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block内修改变量的值 int main(int ar ...
 - # iOS Block的本质(三)
		
iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般 ...
 - iOS Block的本质(二)
		
iOS Block的本质(二) 1. 介绍引入block本质 通过上一篇文章Block的本质(一)已经基本对block的底层结构有了基本的认识,block的底层就是__main_block_impl_ ...
 - iOS Block的本质(一)
		
iOS Block的本质(一) 1.对block有一个基本的认识 block本质上也是一个oc对象,他内部也有一个isa指针.block是封装了函数调用以及函数调用环境的OC对象. 2.探寻block ...
 - (译)IOS block编程指南 1 介绍
		
Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to stan ...
 - [IOS Block和delegate的对比]
		
原文:http://blog.sina.com.cn/s/blog_9e8867eb0102uykn.html 这篇文章建议和前一篇一起看, 另外先弄清楚IOS的block是神马东东. 委托和bloc ...
 
随机推荐
- weui 图片弹框
			
添加图片与弹出效果对比: HTML: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
 - acm结束了
			
最后一场比赛打完了.之前为了记录一些题目,开了这个博客,现在结束了acm,这个博客之后也不再更新了. 大家继续加油!
 - 如何从Exchange邮箱数据库批量删除特定邮件
 - Podfile使用说明
			
什么是Podfile ? CocoaPods是用ruby实现的,因此Podfile文件的语法就是ruby的语法.podfile是一个说明文件,用以描述管理一个或者多个Xcode project的tar ...
 - 练手小游戏(代码篇之敌人AI
			
诶呀~又没有更新微博,去拔牙了,疼死了,休息了几天过来接着写代码~ 首先是Base.写了一个框架,照别人扒的. Base分三部分,AILocomotion(AI移动),Steering(行为基类),V ...
 - maven引入多个spring jar包中存在同名文件的问题
			
项目打包后执行报错:Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespaceht ...
 - php中trait(性状)与generator(生成器)
			
PHP中trait(性状)与generator(生成器) 一.trait (性状) 最近在看Josh Lockhat的<Modern PHP>,这本书很薄.但是其中给出了一个很重要的学习方 ...
 - selenium-----chromedriver与chrome版本映射
			
chromedriver下载地址:http://chromedriver.storage.googleapis.com/index.html chromedriver版本 支持的Chrome版本 v2 ...
 - 【原创】PageAdminCMS 前台SQL注入漏洞(3)
			
之前根据公司的要求找了几个web程序的漏洞提交CNVVD,发现漏洞提交上去两个月了,CNVVD却没有任何回应,我提交的这几个漏洞却悄悄的修补掉了. 文章作者:rebeyond 受影响版本:V3.0 漏 ...
 - 记录下WIN下配置LINUX虚拟机及PYTHON环境
			
因为听说服务器端大多都是LINUX/UNIX,LINUX是程序员必须适应的编程环境,所以今天折腾了一下,给笔记本装了个LINUX虚拟机,并顺便给WINDOWS和LINUX都配置了PYTHON环境. 这 ...