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 ...
随机推荐
- 发布 PM2.5 数据的城市列表
"三亚","三门峡","上海","东莞","东营","中山","临安& ...
- 让淘宝链接在微信中分享,GO
老婆开了个淘宝店,小卖家的心理大家都知道,一开始的小店总是没有光顾,吸引流量成了重中之中. 所以她到处发链接,微信里发了好多条,可是没过多久有好友微她,问她发的时什么,为什么都是打不开的.结果直接傻眼 ...
- ASP.NET Core 获取控制器上的自定义属性
/// <summary> /// 参考代码Microsoft.AspNetCore.Mvc.Internal.AuthorizationApplicationModelProvider ...
- Splunk - 如何在WebFramework之CORS模式下你的网站和splunk web进行交互
1. 修改配置文件以支持CORS 进入/Applications/Splunk/etc/system/local 修改server.conf 在最后加入如下: [httpServer]crossOri ...
- 如何在C语言中调用Swift函数
在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中 ...
- java模拟开锁
java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: ...
- 【网络编程】——linux socket demo
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/socket ...
- android中自定义view---实现竖直方向的文字功能,文字方向朝上,同时提供接口,判断当前touch的是哪个字符,并改变颜色
android自定义view,实现竖直方向的文字功能,文字方向朝上,同时提供接口,判断当前touch的是哪个字符,并改变颜色. 由于时间比较仓促,因此没有对代码进行过多的优化,功能远远不如androi ...
- JS - Object and Property的删除用法
在JS中,Object和Property的删除用法: var myObject = {name:'jimmy', age:12, height:123} delete myObject["j ...
- vs.net 2005 C# WinForm GroupBOX 的BUG?尝试读取或写入受保护的内存。这通常指示其他内存已损坏
其实很久没有写程序了,国庆难得有空闲,写了个游戏辅助机器人,程序写好能用后本想把UI控件放到GroupBox里归下分类,美化下界面,结果一运行报“尝试读取或写入受保护的内存.这通常指示其他内存已损坏” ...