iOS学习之代码块(Block)

代码块(Block)

(1)主要作用:将一段代码保存起来,在需要的地方调用即可。

(2)全局变量在代码块中的使用

全局变量可以在代码块中使用,同时也可以被改变,代码片段如下:

1 int local = 1;//注意:全局变量
2 void (^block0)(void) = ^(void){
3     local ++;
4     NSLog(@"local = %d",local);
5 };
6 block0();
7 NSLog(@"外部 local = %d",local);

结果为:local = 2;

外部 local = 2;

(3)局部变量在代码块中的使用

**一般的局部变量只能在代码块中使用,但不能被改变(此时无法通过编译),代码片段如下:

1 int n = 1000;//局部变量
2 void (^block1)(void) = ^(void){
3 //  n++;
4     NSLog(@"float1 = %d",n);
5 };
6 block1();
7 NSLog(@"float2 = %d",n);

结果为:float1 = 1000

float2 = 1000

**将局部变量声明为__block时,不仅可以在代码块中使用,同时也可以被改变。代码片段如下:

1 __block int j = 200;//声明为__block变量
2 void (^block2)(void) = ^(void){
3     j++;
4     NSLog(@"块变量 = %d",j);
5 };
6 block2();
7 NSLog(@"快变量2 = %d",j);

结果为:块变量 = 201

快变量2 = 201

(4)代码块作为方法参数使用

自定义类:

首先BlockClasss.h类:

 1 #import <Foundation/Foundation.h>
 2
 3 @interface BlockClasss : NSObject
 4
 5 //声明int型变量
 6 @property (nonatomic,assign)int result;
 7 @property (nonatomic,assign)int result2;
 8
 9 - (int)result:(int (^)(int))block;
10
11 - (BlockClasss *(^)(int value))add;
12 @end

然后BlockClasss.m的实现:

 1 #import "BlockClasss.h"
 2
 3 @implementation BlockClasss
 4 - (int)result:(int (^)(int))block{
 5     _result = block(_result);
 6     return _result;
 7 }
 8
 9 - (BlockClasss *(^)(int))add{
10     return ^BlockClasss *(int value){
11         _result2 += value;
12         return self;
13     };
14 }
15 @end

代码块作为方法参数的使用代码:

1 BlockClasss *bl = [[BlockClasss alloc]init];
2 [bl result:^int(int result) {
3     result += 10;
4     result *= 2;
5     return  result;
6 }];
7 NSLog(@"result = %d",bl.result);

结果为:result = 20

(5)代码块作为方法返回值使用:

1 BlockClasss *bl2 = [[BlockClasss alloc]init];
2 bl2.add(100).add(200);
3 NSLog(@"结果 ^=%d",bl2.result2);

打印结果为:结果 ^=300

(6)避免循环引用

在代码块中不能使用self或者_XXX,以免发生循环引用。最好是将self在外部定义为__weak属性,然后再去使用。

例如:

1 __weak self weakSelf = self;
2 _block = ^{
3     NSLog(weakSelf.result);
4 };
时间: 2024-08-12 08:06:41

iOS学习之代码块(Block)的相关文章

[转]iOS代码块Block

代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值,特殊地,Block还可以保存一段代码,在需要的时候调用,目前Block已经广泛应用于iOS开发中,常用于GCD.动画.排序及各类回调 注: Block的声明与赋值只是保存了一段代码段,必须调用才能执行内部代码 Block变量的声明.赋值与调用 Block变量的声明 Block变量的声明格式为: 返回值类型(^Block名字)(参数列表); /

一篇文章看懂iOS代码块Block

iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值,特殊地,Block还可以保存一段代码,在需要的时候调用,目前Block已经广泛应用于iOS开发中,常用于GCD.动画.排序及各类回调 注: Block的声明与赋值只是保存了一段代码段,必须调用才能执行内部代码 Block变量的声明.赋值与调用 Block变量的声明 Block变量的声明格式为: 返回值类型(^Bl

学习IOS--代码块(block)和错误异常处理的理解

1.Object C的代码块(block) Objective-C的代码块从刚刚学习的时候,感觉有点奇怪,慢慢感觉它在C#里面也有点熟悉,它在Objective-C里面的引入,好像是主要用来解决代码回调和同步调用的问题的,说到这里,如果熟悉C#的特性的,可能会联想到了C#里的Action<T>和Func<T>的概念了吧,没错,他们就是一丘之貉,哈哈. 代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到

Objective-C - 代码块block

代码块block /* block要掌握的东西 1> 如何定义block变量 int (^sumBlock)(int, int); void (^myBlock)(); 2> 如何利用block封装代码 ^(int a, int b) { return a - b; }; ^() { NSLog(@"----------"); }; ^ { NSLog(@"----------"); }; 3> block访问外面变量 * block内部可以访问外

Objective-C 代码块(block)的使用

代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱字符(^)是块的语法标记.按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码).下图是如何把块变量赋值给一个变量的语法讲解: 按照调用函数的方式调用块对象变量就可以了:int result = myBlock(4); // result是 28 1.参数是NSString*的代码块 [cpp] view plaincopy voi

Ruby学习之代码块

代码块在其他的语言中都或多或少接触过一些,如perl中sort{$a<=>$b}keys,传入代码块实现按数值排序,在swift中用到闭包,更加深入学习到training closure.capturing value等代码风格,对代码块有了深入的了解,并且意识到代码块是引用类型(Reference Type),和Value Type有所区别,意识到代码块和类.方法等的相似之处. 在学习Ruby的过程中,对代码块的理解更加加深一步,不仅仅是简化代码的功能,还涉及到作用域.可调用对象等知识. 代

IOS笔记-代码块(微博项目)-1.0

1.gcd子线程block代码块 2.遍历子控件 设置系统控件属性 3.UITabBar_tabBarItem字体颜色设置

Objective-C语法之代码块(block)的使用

代码块本质上是和其它变量相似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你能够像调用其它标准函数一样,传入參数数,并得到返回值. 脱字符(^)是块的语法标记.依照我们熟悉的參数语法规约所定义的返回值以及块的主体(也就是能够执行的代码).下图是怎样把块变量赋值给一个变量的语法解说: 依照调用函数的方式调用块对象变量就能够了:int result = myBlock(4); // result是 28 1.參数是NSString*的代码块 void (^printBlock)(NSStr

Objective-C语法之代码块(block)的使用(转)

代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱字符(^)是块的语法标记.按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码).下图是如何把块变量赋值给一个变量的语法讲解: 按照调用函数的方式调用块对象变量就可以了:int result = myBlock(4); // result是 28 1.参数是NSString*的代码块 void (^printBlock)(NSStr