iOS-Block的多种使用
一.图
二.代码
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的多种使用的更多相关文章
- 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 ...
随机推荐
- 报错:ASP.NET Web API中找不到与请求匹配的HTTP资源
当发出GET请求: GET http://localhost:54176/api/Products 报如下错: { "message": "找不到与请求 URI“htt ...
- Android开发(二十六)——Application
application package com.lgaoxiao.application; import java.util.LinkedList; import java.util.List; im ...
- 【国内独家首发】iPhone4 iOS7不完美越狱教程新鲜出炉
准备工作: 1.Mac (OSX 10.8以上系统): 2.iPhone 4 (iPhone3, 1 iOS 7.0.2): 3.iPhone 4数据线一根: 4.下载越狱工具包:ios7_jb_ki ...
- 画六边形-mat
%% theta = linspace(0,2*pi,7); D=2; %边长 X=1; %中心横坐标 Y=2; %中心纵坐标 plot(D*cos(theta)+X,D*sin(theta) + Y ...
- Difference between Satisfiable, Valid, Unsatisfiable & Invalid
A formula is satisfiable if it is possible to find an interpretation (model) that makes the formula ...
- spring中配置了事务,数据业务层捕获异常,事务配置不成功?
原理:spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常 ...
- Linux64位服务器编译安装MySQL5.6(CentOS6.4)
首先到MySQL官网下载MySQL最新版(目前是mysql-5.6.12)上传到服务器上,下面说一下详细的安装过程. 安装依赖包,可以在线更新也可以配置本地源(CentOS本地源配置)yum -y i ...
- Spring MVC 事务配置
Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: 一. XML,使用tx标签配置拦截器实现事务 一. ...
- SD卡中FAT32文件格式快速入门(图文详细介绍)【转】
本文转自:http://blog.csdn.net/mjx91282041/article/details/8904705 说明: MBR :Master Boot Record ( 主引导记录) D ...
- Windows Store 开发总结——文件操作
1.读取Isolated Storage 每个Metro程序都有三个文件夹:Local,Roaming,Temp.每个文件夹的访问方法都是相同的. Local用于将数据存储在本地,这是程序特定的文件夹 ...