一.图

二.代码

1.viewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

2. viewController.m

#import "ViewController.h"

#import "SecondViewController.h"

@interface ViewController ()

@end

/** 什么是Block

1. 苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,Block可以在任何时候执行.

2. Block和函数的相似性:  (1) 可以保存代码

(2) 有返回值

(3) 有形参

(4) 调用方式一样

3. 标识符 ^

*/

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// block 1   ---> 定义一个Block类型答应一个for循环

[self block1];

// block 2   ---> 定义一个block类型的变量,接受两个参数,做加法运算

[self block2];

// block 3   ---> bolck的基本使用

[self block3];

//block 4    ---> Block访问外部变量

[self block4];

//block 5    ---> 利用tpedef定义block类型

[self block5];

//block 6   ----> 页面传值

[self block6];

}

#pragma mark 定义一个Block类型答应一个for循环

- (void)block1

{

//定义一个Block类型:名字叫MyBlock

void(^FirstBlock)(int) = ^(int n)

{

NSLog(@"%d",n);

for (int i = 0; i < n; i ++)

{

NSLog(@"n: %d",i);

}

};

//调用block

FirstBlock(5);

NSLog(@"--结束--");

/** Block执行的顺序

1. 先执行定义的Block--> FirstBlock.

2. 调用Block,获取到参数值,然后执行Block语句块.

*/

}

#pragma mark 两个参数的Block

- (void)block2

{

/** Block

1. 带有返回值的Block

2. 两个参数的Block

*/

int (^SecondBlock)(int,int) = ^(int n1, int n2)

{

return n1 + n2;

};

// 调用block

NSLog(@"%d",SecondBlock(12,14));

}

#pragma mark block的基本使用

- (void)block3

{

/** block基本使用

1. 定义Block

(1) 无参数,返回值类型为空

void (^ Block)()

(2) 有参数,返回值为 int

int (^ Block)(int)

2. 利用block封装代码块

*/

// 利用block封装代码块

// (1) 无参数无返回值

void (^FirstBlcok)() = ^()

{

NSLog(@"10");

};

//调用Block

FirstBlcok();

// (2) 有参数无返回值

NSString * (^SecondBlock)() = ^()

{

NSLog(@"无参数的有返回值的Blcok");

return @"无参数的有返回值的Blcok";

};

//调用Block

SecondBlock();

// (3) 有返回值有参数类型

int (^ThirdBlock)(int,int) = ^(int n1,int n2)

{

return n1 + n2;

};

//调用Block --> ThirdBlock(1,2)返回值类型是int

NSLog(@"%d",ThirdBlock(1,2));

}

#pragma mark block访问外部变量

- (void)block4

{

/**

1. block内部可以访问外部变量;

2. 默认情况下,Block内部不能修改外部的局部变量.

3. 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改.

*/

__block int a = 0;

void (^fourthBlcok)(int) = ^(int n1)

{

a = n1;

NSLog(@"a: %d",a);

};

fourthBlcok(10);

}

#pragma mark 利用tpedef定义block类型

- (void)block5

{

typedef int(^FifthBlock)(int,int);

FifthBlock a,b;

a = ^(int a,int b)

{

return a + b;

};

FifthBlock b2 = ^(int n1,int n2)

{

return n1 * n2;

};

NSLog(@"%@-%@-%@",a,b,b2);

}

- (void)block6

{

UIButton * button6 = [UIButton buttonWithType:UIButtonTypeCustom];

button6.frame = CGRectMake(10, 30, 200, 40);

button6.backgroundColor = [UIColor orangeColor];

[button6 addTarget:self action:@selector(block6JumpClicked) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:button6];

SecondViewController * secondViewController = [[SecondViewController alloc] init];

secondViewController.changeColorBlock = ^(UIColor * color)

{

self.view.backgroundColor = color;

};

}

- (void)block6JumpClicked

{

/** 页面传值Block注意点

1. 在传值页面   用typedef定义Block

2. 在传值页面   创建block属性

3. 在传值页面   模态跳转回来的时候,调用该Block

4. 在接收值页面 实现block代码块

*/

SecondViewController * secondViewController = [[SecondViewController alloc] init];

//实现block

secondViewController.changeColorBlock = ^(UIColor * color)

{

self.view.backgroundColor = color;

};

[self presentViewController:secondViewController animated:YES completion:^{

}];

}

@end

3. SecondViewController.h

#import <UIKit/UIKit.h>

typedef void(^ChangeColorBlock)(UIColor * color);

@interface SecondViewController : UIViewController

@property (nonatomic, strong) ChangeColorBlock changeColorBlock;

@end

4.SecondViewController.m

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor redColor];

[self createButton];

}

- (void)createButton

{

UIButton * button6 = [UIButton buttonWithType:UIButtonTypeCustom];

button6.frame = CGRectMake(10, 30, 200, 40);

button6.backgroundColor = [UIColor orangeColor];

[button6 addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:button6];

}

- (void)back

{

//调用block

if (self.changeColorBlock)

{

self.changeColorBlock(self.view.backgroundColor);

}

[self dismissViewControllerAnimated:YES completion:^{

}];

}

@end

iOS-Block的多种使用的更多相关文章

  1. iOS Block界面反向传值

    在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C ...

  2. iOS block从零开始

    iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void ...

  3. iOS block 机制

    本文要将block的以下机制,并配合具体代码详细描述: block 与 外部变量 block 的存储域:栈块.堆块.全局块 定义 块与函数类似,只不过是直接定义在另一个函数里,和定义它的那个函数共享同 ...

  4. ios Block详细用法

    ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...

  5. iOS Block的本质(四)

    iOS Block的本质(四) 上一篇文章iOS Block的本质(三)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block内修改变量的值 int main(int ar ...

  6. # iOS Block的本质(三)

    iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般 ...

  7. iOS Block的本质(二)

    iOS Block的本质(二) 1. 介绍引入block本质 通过上一篇文章Block的本质(一)已经基本对block的底层结构有了基本的认识,block的底层就是__main_block_impl_ ...

  8. iOS Block的本质(一)

    iOS Block的本质(一) 1.对block有一个基本的认识 block本质上也是一个oc对象,他内部也有一个isa指针.block是封装了函数调用以及函数调用环境的OC对象. 2.探寻block ...

  9. (译)IOS block编程指南 1 介绍

    Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to stan ...

  10. [IOS Block和delegate的对比]

    原文:http://blog.sina.com.cn/s/blog_9e8867eb0102uykn.html 这篇文章建议和前一篇一起看, 另外先弄清楚IOS的block是神马东东. 委托和bloc ...

随机推荐

  1. IIS下使用appcmd批量搭建网站

    使用 cmd 运行如下命令 > %windir%\system32\inetsrv\appcmd list site /config /xml > d:\sites.xml 修改 d 盘 ...

  2. ASP.NET Web API的安全管道

    本篇体验ASP.NET Web API的安全管道.这里的安全管道是指在请求和响应过程中所经历的各个组件或进程,比如有IIS,HttpModule,OWIN,WebAPI,等等.在这个管道中大致分两个阶 ...

  3. “代理XP”组件已作为此服务器安全配置的一部分被关闭的解决办法

    代理XP”组件已作为此服务器安全配置的一部分被关闭.系统管理员可以使用sp_configure来启用“代理XP”.有关启用“代理XP”的详细信息,请参阅SQL Server联机丛书中的“外围应用配置器 ...

  4. ios app 提交评审注意事项

    在网络上看到的一个文档是这样写,原文的出处无法确认了 基本要点 ·         不能导致手机故障(比如崩溃或屏幕问题) ·         长时间/过度使用之后反应仍然很快 ·         应 ...

  5. 第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[2] - 透视变换(cvWarpPerspective)

    透视变换(单应性?)能提供更大的灵活性,但是一个透视投影并不是线性变换,因此所采用的映射矩阵是3*3,且控点变为4个,其他方面与仿射变换完全类似,下面的例程是针对密集变换,稀疏图像变换则采用cvPer ...

  6. Python字符串的修改以及传参

    前两天去面试web developer,面试官提出一个问题,用JavaScript或者Python实现字符串反转,我选择了Python,然后写出了代码(错误的): #!/usr/bin/env pyt ...

  7. ASP.NET弹出显示ex.Message异常信息 存在换行符和回车符处理办法。

    1.把ex.Message换成任意字符串,检验在catch语句块中可以用Response.Write方法显示对话框.结果显示成功,说明问题就出在ex.Message上. 2.在程序中下断点,可以看到e ...

  8. python字符串格式化方法 format函数的使用

      python从2.6开始支持format,新的更加容易读懂的字符串格式化方法, 从原来的% 模式变成新的可读性更强的 花括号声明{}.用于渲染前的参数引用声明, 花括号里可以用数字代表引用参数的序 ...

  9. eclipse无线连接android真机能进调试

    将手机与电脑连接到同一个网段, 在手机上安装wifi adb程序,并打开,会得到一个IP及端口,比如是 192.168.1.126:5555 进入android sdk目录sdk\platform-t ...

  10. C#集合-列举(Enumeration)

    在计算机这个范畴内存在许多种类的集合,从简单的数据结构比如数组.链表,到复杂的数据结构比如红黑树,哈希表.尽管这些数据结构的内部实现和外部特征大相径庭,但是遍历集合的内容确是一个共同的需求..NET ...