一.图

二.代码

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. 报错:ASP.NET Web API中找不到与请求匹配的HTTP资源

    当发出GET请求: GET http://localhost:54176/api/Products 报如下错: {  "message": "找不到与请求 URI“htt ...

  2. Android开发(二十六)——Application

    application package com.lgaoxiao.application; import java.util.LinkedList; import java.util.List; im ...

  3. 【国内独家首发】iPhone4 iOS7不完美越狱教程新鲜出炉

    准备工作: 1.Mac (OSX 10.8以上系统): 2.iPhone 4 (iPhone3, 1 iOS 7.0.2): 3.iPhone 4数据线一根: 4.下载越狱工具包:ios7_jb_ki ...

  4. 画六边形-mat

    %% theta = linspace(0,2*pi,7); D=2; %边长 X=1; %中心横坐标 Y=2; %中心纵坐标 plot(D*cos(theta)+X,D*sin(theta) + Y ...

  5. Difference between Satisfiable, Valid, Unsatisfiable & Invalid

    A formula is satisfiable if it is possible to find an interpretation (model) that makes the formula  ...

  6. spring中配置了事务,数据业务层捕获异常,事务配置不成功?

    原理:spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常 ...

  7. Linux64位服务器编译安装MySQL5.6(CentOS6.4)

    首先到MySQL官网下载MySQL最新版(目前是mysql-5.6.12)上传到服务器上,下面说一下详细的安装过程. 安装依赖包,可以在线更新也可以配置本地源(CentOS本地源配置)yum -y i ...

  8. Spring MVC 事务配置

    Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: 一.      XML,使用tx标签配置拦截器实现事务 一.   ...

  9. SD卡中FAT32文件格式快速入门(图文详细介绍)【转】

    本文转自:http://blog.csdn.net/mjx91282041/article/details/8904705 说明: MBR :Master Boot Record ( 主引导记录) D ...

  10. Windows Store 开发总结——文件操作

    1.读取Isolated Storage 每个Metro程序都有三个文件夹:Local,Roaming,Temp.每个文件夹的访问方法都是相同的. Local用于将数据存储在本地,这是程序特定的文件夹 ...