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 ...
随机推荐
- BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题
BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题 原文:http://www.sufeinet.com/thread-3707-1-1.html 大家可以先看看我上 ...
- JavaScript 中数组实用浅析
本文适用于HTML.ASP 中的 JavaScript 脚本代码.代码以 HTML 中的 JS 为例,如果在 ASP 中,请将 document.write 改为 Response.Write 即可. ...
- Bag标签之中的一个行代码实行中文分词实例2
例1: 分词(返回以逗号隔开每一个词带上引號的词组.gap=",",quotes="'"或quotes='"') 单引號 <bag id=pPa ...
- 《CSS 设计指南》学习笔记 一
本篇文章是对这几天看完 Charles Wyke-Smit 的 <CSS 设计指南> 后的一些学习笔记与心得,笔者好像是大一的时候开始接触网页设计,由于并不是计算机专业的,所以所有都是自己 ...
- android openmax hardware decoder 整合记录
欢迎访问我的blog:http://blog.thinkinside.me 关于android中openmax中hardware decoder的调用中,整合过程比较简单.主要是对OMXCodec的封 ...
- TargetProcess公司敏捷开发历程-开发实践篇
- fedora Server 21 安装 Opera 29.0.1795.47
最新文章:Virson's Blog 安装源: yum localinstall --nogpgcheck http://mirror.yandex.ru/fedora/russianfedora/r ...
- coreData 深入理解4 --总结 (线程安全与同步--iOS5 前后对比)
Core Data是iOS中很重要的一个部分,可以理解为基于SQLite(当然也可以是其他的Storage,如In-memory,只是SQLite比较常见)的一个ORM实现,所以有关系数据库的特性,又 ...
- oracle create table(转)
//建测试表 create table dept( deptno number(3) primary key, dname varchar2(10), loc varchar2(13) ); crea ...
- Changing Project Binding to Surround SCM Integration Provider with Visual Studio 2010
Changing Project Binding to Surround SCM Integration Provider with Visual Studio 2010 Sarah Wigser t ...