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的

Block Demo的更多相关文章

  1. 瘋耔java语言笔记

    一◐ java概述                                                                                        1.1 ...

  2. devices-list

    转自:https://www.kernel.org/pub/linux/docs/lanana/device-list/devices-2.6.txt LINUX ALLOCATED DEVICES ...

  3. 制作变形、移位、扭曲等效果:《CSS3 transform》

    今天开始我们一起来学习有关于CSS3制作动画的几个属性:变形(transform).转换(transition)和动画(animation)等更高级的CSS3技术.本文主要介绍的是这三个属性之中的第一 ...

  4. PC--CSS技巧

    1.图片不存在的时候,显示一个默认图片 <img src=”01.jpg” onerror=”this.src=’02.jpg'” /> 2.CSS强制图片自适应大小 img {width ...

  5. CSS3 转换2D transform

    Transform字面上就是变形,改变的意思.在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix.下面我们一 ...

  6. iOS 跑马灯带图片可点击

    项目中有个需求,需要以跑马灯的形势滚动展示用户的实时数据,跑马灯需要有用户头像,内容的长度不固定,并且可以点击,滚动效果还要足够流畅,本着不重复造轮子的心理,在网上各种搜索,发现都没法找到满足需求的d ...

  7. DJango 基础 (4)

    Django模板标签 知识点: 基本概念 常用标签 模板标签例子 模板继承与应用 注释标签 模板标签 标签在渲染的过程中提供任意的逻辑. 这个定义是刻意模糊的. 例如,一个标签可以输出内容,作为控制结 ...

  8. Java知多少(31)static关键字以及Java静态变量和静态方法

    static 修饰符能够与变量.方法一起使用,表示是“静态”的. 静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法.静态 ...

  9. 31.JS实现控制HTML5背景音乐播放暂停

    实现控制网站背景音乐的播放暂停在html5中是非常容易和简单的,仅仅几行代码即可实现.首先在网页中嵌入背景音乐,html5代码为: <script src="http://wuover ...

随机推荐

  1. HTML特殊符号对照表 常用字符实体

    前沿:阿飞表示虽然大部分都不常用,但是有些基本的还是要背下的,比如空格,大于,小于.^_^

  2. jeecg 3.7.1 新版功能,集群定时任务动态发布模块 使用规则

    jeecg 3.7.1  集群定时任务动态发布模块 使用规则   新版特性:    支持集群定时任务,支持分布式. 菜单路径: 系统监控-->定时任务 字段说明: 任务ID.任务说明:自定义即可 ...

  3. js实现每次程序发送一个数据 ,多次发送不一样,5秒后继续执行多次程序,判断如果五秒后发送过来的数据和上次不一样,少的删除多的增加

    /*存储设备ID*/var IDSNew = new Array();//判断是否已经启用服务var isopen = true;//需要放到接收设备数据处IDSNew[client.deviceId ...

  4. 专业运维配的vsftpd.conf

    需要另外写userlist,下面的配置文件可以参考,这是使用云镜像市场的全能java环境装的机. [root@VM_1_202_centos vsftpd]# cat vsftpd.conf # Ex ...

  5. TC358775XBG:MIPI DSI转双路LVDS芯片简介

    TC358775XBG是一颗MIPI DSI转双路LVDS芯片,通信方式:IIC/MIPI command mode,分辨率1920*1200,封装形式:BGA64.

  6. 设置Linux环境变量的方法与区别(Ubuntu)

      设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别.   通过文件设置 Linux 环境变量 首先是设置全局环境变量, ...

  7. Java 生产图片验证码

    import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;impor ...

  8. mysql:ip地址连接

    2. 为用户授权 授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 2.1登录MYSQL(有ROOT权限),这里以ROO ...

  9. websocket实现简单聊天程序

    程序的流程图: 主要代码: 服务端 app.js 先加载所需要的通信模块: var express = require('express'); var app = express(); var htt ...

  10. ABB-robotstudio离线编程-Smart组件资料-笔记

    Smart组件 目录: 1.“信号与属性”子组件. 2.“参数与建模”子组件. 3.“传感器”子组件. 4.“动作”子组件. 5.“本体”子组件. 6.“其他”子组件. 一.“信号与属牲”子组件 1. ...