iOS开发——语法&高级Block练习

高级Block练习

一 .最简单的block使用 

 使用block的三个步骤:1.定义block变量 2.创建block代码块 3.调用block匿名函数

定义一个block的构成包括:返回值,block名,参数类型。

block代码块作为一个匿名函数是可以被写在其他方法中的,所以一般我们将block代码块写在其他方法里,调用该方法的时候block代码块将不会被执行,只有回调block代码块的时候,才会执行。

ViewController.h

 1 #import <UIKit/UIKit.h>
 2
 3 @interface ViewController : UIViewController
 4
 5 @property(nonatomic,copy) void(^myBlock)(int);//1.声明一个block变量,直接将block声明成一个属性变量更方便实用。
 6
 7 @end
 8
 9 ViewController.m
10
11 #import "ViewController.h"
12
13 #import "NewViewController.h"
14
15 @interface ViewController ()
16
17 @end
18
19 @implementation ViewController
20
21 - (void)viewDidLoad {
22
23 [super viewDidLoad];
24
25 //注意:先加载写block代码块的方法
26
27 [self blockTest];
28
29 }
30
31 -(void)blockTest{
32
33 //2.在方法里面写block代码块
34
35 _myBlock = ^(int a){
36
37 NSLog(@"%d",a);
38
39 };
40
41 }
42
43 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
44
45 //3.调用block匿名函数
46
47 _myBlock (10);
48
49 NewViewController * newViewController = [[NewViewController alloc]init];
50
51 newViewController.block = _myBlock;
52
53 [self presentViewController:newViewController animated:YES completion:^{
54
55 }];
56
57 }
58
59 @end

上面代码,在ViewController里面实现了block实现的三个步骤,该block的功能就是打印参数值。

touch方法实现从ViewController到NewViewController的跳转,同时将ViewController里面的block即myBlock赋给NewViewController里定义的block,使得两个block实质上成为同一个block,这样,在NewViewController里面就耶可以调用ViewController里的代码块了。

NewViewController.h

1 #import <UIKit/UIKit.h>
2
3 #import "ViewController.h"
4
5 @interface NewViewController : UIViewController
6
7 @property(nonatomic,copy)void(^block)(int a);
8
9 @end

NewViewController.m

 1 #import "NewViewController.h"
 2
 3 @interface NewViewController ()
 4
 5 @end
 6
 7 @implementation NewViewController
 8
 9 - (void)viewDidLoad {
10
11 [super viewDidLoad];
12
13 self.view.backgroundColor=[UIColor grayColor];
14
15 }
16
17 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
18
19 self.block(100);
20
21 [self dismissViewControllerAnimated:YES completion:^{
22
23 }];
24
25 }
26
27 @end

二.block其他定义类型

通过typedef声明block类型(因为block没有类型,用typedef声明一个类型)。如下两个声明了两个finishedblock类型的block。

 1 #import <UIKit/UIKit.h>
 2
 3 typedef int(^FinishedBlock)(int);     //此处FinishedBlock不是block变量,而是一种类型,即FinishedBlock类型。
 4
 5 @interface ViewController : UIViewController
 6
 7 {
 8
 9 FinishedBlock block1; //typedef声明一个FinishedBlock后,就可以用该类型定义block变量。
10
11 }
12
13 @property(nonatomic,copy) FinishedBlock block2;
14
15 @end
16
17 #import "ViewController.h"
18
19 @interface ViewController ()
20
21 @end
22
23 @implementation ViewController
24
25 - (void)viewDidLoad {
26
27 [super viewDidLoad];
28
29 block1 = ^(int a){
30
31 NSLog(@"%d",a);
32
33 return a;
34
35 };
36
37 _block2 = ^(int a){
38
39 NSLog(@"%d",a);
40
41 return a;
42
43 };
44
45 FinishedBlock block3 = ^(int a){
46
47 NSLog(@"%d",a);
48
49 return a;
50
51 };
52
53 block3(30);//回调
54
55 [self test];
56
57 }
58
59 -(void)test{
60
61 //回调
62
63 block1(10);
64
65 _block2(20);
66
67 }
68
69 @end

打印结果:

2015-07-15 20:57:22.226 Test[618:21849] 30

2015-07-15 20:57:22.227 Test[618:21849] 10

2015-07-15 20:57:22.227 Test[618:21849] 20

三.block作为参数传递

 1 #import <UIKit/UIKit.h>
 2
 3 typedef int(^FinishedBlock)(int);
 4
 5 @interface ViewController : UIViewController
 6
 7 @end
 8
 9 #import "ViewController.h"
10
11 @interface ViewController ()
12
13 @end
14
15 @implementation ViewController
16
17 - (void)viewDidLoad {
18
19 [super viewDidLoad];
20
21 [self testBlock:^int(int a) {
22
23 NSLog(@"%d",a);
24
25 return a;
26
27 }];
28
29 }
30
31 -(void)testBlock:(FinishedBlock)block{
32
33 block(1000);//回调
34
35 }
36
37 @end
时间: 2024-10-12 15:53:11

iOS开发——语法&高级Block练习的相关文章

iOS开发-语法篇-block详解

一:基本定义 /*初步上式block定义的一些理解和解释,接下来会详解: *block名为myBlock,结合C的函数指针,myBlock为block体的指针,指向block体的入口地址 *int result = myBlock(5) <==> ^(int num){return num*num}(5)//将5传给num *回调时可以将myBlock作为参数传入,也可以直接传入block体^(int num){…};// *整个block体作为参数传入时,往往没有参数,只是进行延迟运算作用,

IOS开发- 用block实现回调

在IOS开发中经常会用到回调的情况,下面介绍如何用block实现回调. 1 #import <Foundation/Foundation.h> 2 3 @interface BLock : NSObject 4 5 + (void)getBlock:(void (^)(NSString *))someblock; 6 7 @end BLock.h 1 #import "BLock.h" 2 #import <Foundation/Foundation.h> 3

iOS开发——语法OC篇&amp;Block回顾

Block回顾 这里知识简单介绍一下关于Block的语法,如果你觉得这里很简单或者想学习更深入的的使用清查看记者之前写的使用block传值和高级Block使用: http://www.cnblogs.com/iCocos/p/4534281.html http://www.cnblogs.com/iCocos/p/4550169.html http://www.cnblogs.com/iCocos/p/4659878.html http://www.cnblogs.com/iCocos/p/46

ios开发——实用技术篇&amp;Block/KVO/通知/代理

Block/KVO/通知/代理简单介绍与使用 关于iOS开发中数据传递的方法有很多种,但是使用最多的就是这里的四种,而且我们要学会在适当的时候使用合适的方式,才能充分的提高app的性能 下面简单介绍一下这些方法的使用 Block 第一.综述 block是OC中另外一种对象和对象的通信方式,是一对一的关系,类似于delegate,而通知时一对多的关系 第二.定义block类型 int (^myBlock)(int) 第三.block的声明 mylock=^(int a) { int result

iOS开发Delegate,Notification,Block使用心得

(一)简要介绍 1.Delegate(代理.委托) 代理几乎是iOS开发中最常用的传值方式,在项目中的AppDelegate就是使用的这种设计模式,不仅如此,还有很多原生的控件也使用的这种设计模式,比如:UITextFiled,UITableView等等.官方给出的解释如下: Delegation is a simple and powerful pattern in which one object in a program 1 acts on behalf of, or in coordin

IOS开发-Object-C Block的实现方式

前言:我们可以把Block当作一个闭包函数,它可以访问外部变量和局部变量,但默认是不可以修改外部变量.你可以使用它来做回调方法,比起使用代理(Delegate)会更加直观.顺带一提,苹果很多的接口(API)都使用了Block. 一.Block的基本定义 Block的基本写法(也是详细写法): returnType (^blockName)(params) = ^returnType(params) { // code... }; 中文再解释:返回类型 (^Block的名字)(Block的参数)

iOS开发——语法篇OC篇&amp;高级语法精讲二

Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发.下面通过分析Apple开源的Runtime代码(我使用的版本是objc4-646.tar)来深入理解Objective-C的Runtime机制. Runtime数据结构 在Objective-C中,使用[receiver message]语法并不会马上执行receiver对象的message方

iOS开发——语法篇OC篇&amp;高级语法精讲

高级语法精讲 一.NSSet.NSMutableSet集合的介绍 1)NSSet.NSMutableSet集合,元素是无序的,不能有重复的值. 2)用实例方法创建一个不可变集合对象 例如: //宏定义 #define TOBJ(n) [NSNumber numberWithInt:n] NSSet *set1=[[NSSet alloc]initWithObjects:TOBJ(2),TOBJ(3),TOBJ(3),TOBJ(1),TOBJ(5), nil]; 2)用类方法创建一个不可变集合对象

iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)

使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: 首先,创建两个视图控制器,在第一个视图控制器中创建一个UILabel和一个UIButton,其中UILabel是为了显示第二个视图控制器传过来的字符串,UIButton是为了push到第二个界面. 第二个界面的只有一个UITextField,是为了输入文字,当输入文字,并且返回第一个界面的时候,当第二个视图将要消失的时候,就将第二个界面上TextFiled中的文字传给第一个界面,并且显