一.图

二.代码

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. 【CUDA学习】GPU硬件结构

    GPU的硬件结构,也不是具体的硬件结构,就是与CUDA相关的几个概念:thread,block,grid,warp,sp,sm. sp: 最基本的处理单元,streaming processor  最 ...

  2. Skyline6.5系列覆盖三维地理信息产业上下游

    SkylineGlobe将于近日推出6.5 系列产品.该系列产品提供从产业链上游影像处理.中游二三维展示分析.下游具体业务应用等覆盖整个三维空间地理信息产业链的一体化.一站式产品与服务. Skylin ...

  3. mac OSX 上 brew install hive

    本文介绍brew install hive并修改默认的metastore存储方案,改Derby数据库为mysql的方法以及可能遇到的问题的解决方案. 1. 通过homebrew安装hive 1 bre ...

  4. bash的循环中无法保存变量

    在bash中,如果循环在一个子shell中运行,那么在循环中对循环外面的变量的更改将在循环退出后不可见.像下面的例子: #!/bin/sh python run.py | while read lin ...

  5. 如何修改 EM12c 中 SYSMAN 用户的密码?

    以下内容全部转自:http://www.chenjunlu.com/2013/04/how-to-modify-the-password-for-sysman-of-em-12c-cloud-cont ...

  6. drupal7 Views Slideshow 简单教程

    一.下载安装(略) 二.内容类型建立(过程略,首页幻灯),字段建立(过程略)主要有2个字段,图片字段 和 指向链接字段 三.view 1.建立一个新的view,名称为frontbanner 显示为内容 ...

  7. Net框架下-ORM框架LLBLGen的简介

    >对于应用程序行业领域来说,涉及到Net框架的,在众多支持大型项目的商用ORM框架中,使用最多的目前了解的主要有三款: 1.NHibernate(从Java版移植来的Net版). 2.微软的EF ...

  8. js 当前日期增加自然月

    js 在日期不满足的情况下就会自动加1个月,比如在当前时间为3月31号,传入1,1两个参数,预期结果为2月29日,但是结果输出了3月2日.就是如果不满就会溢出到下个月,后来看了api发现了setMon ...

  9. Android之 -WebView实现离线缓存阅读

    前言 本篇博客要实现的是一个离线下载和离线阅读的功能,这是很多阅读类app都常见的一个功能,典型的应用就是网易新闻.什么是离线下载?其实这个概念是比较模糊,是离线之后下载呢,还是下载之后离线,但稍微有 ...

  10. 使用Spring MVC统一异常处理

    http://blog.csdn.net/ufo2910628/article/details/40399539