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 ...
随机推荐
- linux shell 多线程执行程序
Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能. 直接看代码示例吧. (1) 顺序执行的代码 #!/bin/bash date ` do { echo & ...
- mysql 修改root登录密码
mysql -u root -p 然后回车,进入(等于用空密码进入) 2 use mysql; update user set password=password('123456') where us ...
- 新建一个Activity
如果只是新建一个class,还得自己添加XML,好不麻烦: eclipse里可以直接new other Andriod activity,ADT还是很强发滴.哈哈.
- 线程互斥与析构函数中mutex的销毁
正在实现一个线程池的pthread包装器,突然发现有人在讨论关于http://blog.csdn.net/Solstice/article/details/5238671 是一篇比较老的文章,考虑了下 ...
- YAFFS2文件系统分析(转)
http://blog.chinaunix.net/uid-25314474-id-343665.html 1.前言略. 2.yaffs 文件系统简介按理说这里应该出现一些诸如“yaffs 是一种适合 ...
- 使用 ContentProviderOperation 来提升性能
ContentProviders 是android 系统核心组件之一,ContentProviders 封装了数据的访问接口,其底层数据一般都是保存在数据库中或者保存在云端. 有时候你需要更新多行数 ...
- 转:HTML5标准与性能之四:asm.js
HTML5标准与性能之四:asm.js Cong Liu (Intel) 于 星期五, 24/05/2013 - 01:13 提交 之前的几篇文章分别介绍了WebWorkers.Typed Array ...
- 【css3】如何自定义 placeholder 文本颜色
昨天写了一篇基于 jquery 实现 ie 浏览器兼容 placeholder 效果,具体内容点击传送门.不过还是有点小瑕疵,就是不能设置 placeholder 文本颜色.本文主要介绍利用 css ...
- UDP"打洞"原理
1. NAT分类 根据Stun协议(RFC3489),NAT大致分为下面四类 1) Full Cone 这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口 ...
- 简化 Hadoop 2.4.1 Eclpse 插件编译【原创】
昨天折腾hadoop2X的eclipse插件,从https://github.com/winghc/hadoop2x-eclipse-plugin把源码搞下来后,很快搞定出来一个,但是...New H ...