1.预定义Block

typedef  void(^myblock1)(int a,int b);

2.将Block做为类的属性

@property(nonatomic,strong) myblock1 block1;

3.代码demo 在.h中声明了一个方法用于调用Block

#import <Foundation/Foundation.h>

typedef  void(^myblock1)(int a,int b);

@interface Myblock : NSObject

@property(nonatomic,strong) myblock1 block1;

-(void)fun:(int) seta  param1 :(int)setb;

@end

在.m中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#import "block.h"
 
@implementation Myblock
- (instancetype)init
{
    self = [super init];
    if (self) {
         
    }
    return self;
}
-(void)fun:(int) seta  param1 :(int)setb;
{
 
    _block1(seta,setb);
     
}
 
@end

在main中:实例化类,并为作为属性的Block指明执行的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
#import <Foundation/Foundation.h>
#import "block.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Myblock *myblock1=[[Myblock alloc]init];
        myblock1.block1=^(int a,int b)
        {
            NSLog(@"%d",a+b);
        };  
        [myblock1 fun:5 param1:5];
    }
    return 0;
}

OC中的Block类似C、C++的函数指针,C#的委托、匿名函数和Lambda,与其不同的是Block可以访问函数以外、词法作用域以内的外部变量的值。换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境

Block对外部变量的存取管理

基本数据类型

1、局部变量

局部自动变量,在Block中只读。Block定义时copy变量的值,在Block中作为常量使用,所以即使变量的值在Block外改变,也不影响他在Block中的值。

1

2

3

4

5

6

7

8

9

10

11

{

int base = 100;

long (^sum)(int, int) = ^ long (int a, int b) {

return base + a + b;

};

base = 0;

printf("%ld\n",sum(1,2));

// 这里输出是103,而不是3, 因为块内base为拷贝的常量 100

}

2、STATIC修饰符的全局变量

因为全局变量或静态变量在内存中的地址是固定的,Block在读取该变量值的时候是直接从其所在内存读出,获取到的是最新值,而不是在定义时copy的常量.

1

2

3

4

5

6

7

8

9

10

11

12

13

{

static int base = 100;

long (^sum)(int, int) = ^ long (int a, int b) {

base++;

return base + a + b;

};

base = 0;

printf("%ld\n",sum(1,2));

// 这里输出是4,而不是103, 因为base被设置为了0

printf("%d\n", base);

// 这里输出1, 因为sum中将base++了

}

3、__BLOCK修饰的变量

Block变量,被__block修饰的变量称作Block变量。 基本类型的Block变量等效于全局变量、或静态变量。

注:BLOCK被另一个BLOCK使用时,另一个BLOCK被COPY到堆上时,被使用的BLOCK也会被COPY。但作为参数的BLOCK是不会发生COPY的

最新文章

  1. Android 6.0 权限知识学习笔记
  2. LL(1)文法
  3. Android开发:在EditText中关闭软键盘 转来的
  4. 推荐几本 Javascript 书籍
  5. 问题-Tbutton(sender) 与 (sender as Tbutton) 等价吗?
  6. Google科学家前腾讯副总裁吴军将出席第二届万物互联创新大会
  7. Win10无法连接远程桌面提示“你的凭据不工作”的三个解决方法
  8. web 直播&amp;即时聊天------阿里云、融云(三)
  9. [整理]Linux Crontab命令总结
  10. Java创建二叉搜索树,实现搜索,插入,删除操作
  11. python输入字符串
  12. Day2 Numerical simulation of optical wave propagation之标量衍射理论基本原理(二)
  13. 课程9:《hibernate框架开发2016版视频》视频目录
  14. [转]HEX文件格式解析
  15. vue2.0路由切换后页面滚动位置不变BUG
  16. JVM技术周报第1期
  17. 浅谈我的UI设计之路
  18. 入门GTD时间管理系统必读
  19. .NET中的文件IO操作实例
  20. leetcode刷刷刷

热门文章

  1. Python初学——多进程Multiprocessing
  2. 高新技术---枚举及部分JDK1.5新特性
  3. Linux下C/C++和lua交互-Table
  4. oracle导库
  5. tomcat设置文件编码
  6. 推荐一款接口文档在线管理系统-MinDoc
  7. java内存区域分析及java对象的创建
  8. UEditor Flash文件上传-crossdomain.xml文件配置
  9. css3新特性---(border,Background部分)
  10. 201521123024 《Java程序设计》第5周学习总结