Block Demo

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中:


#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指明执行的方法


#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中的值。

{

    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的常量.

{

    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的

时间: 2024-09-23 13:07:30

Block Demo的相关文章

网页图文混排教程:图文居中显示

文章简介:用到的CSS属性值:inline-block:将对象呈递为内联对象,但是对象的内容作为块对象呈递.旁边的内联对象会被呈递在同一行内就这样,完美的图文居中显示就做出来了. 是不是很惊奇?事实告诉我们,合理的利用CSS既可实现一些似乎不太可能的效果. 工作中经常会遇到一个图文的效果,如图: 再常见不过的效果了,对于下面的文字,一般我们的处理方式是居中,但文字多了会怎么办呢?有人会回答"隐藏":也有人会回答"换行".对于"换行"的处理方法我们

详解Java编程中static关键字和final关键字的使用_java

Java static关键字以及Java静态变量和静态方法 static 修饰符能够与变量.方法一起使用,表示是"静态"的. 静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法.静态变量与实例变量不同,实例变量总是通过对象来访问,因为它们的值在对象和对象之间有所不同. 请看下面的例子: public class Demo { static int i = 10; int j; Demo() { this.j

ARC下的block导致的循环引用问题解析

ARC下的block导致的循环引用问题解析 更详细细节请参考 http://blog.sina.com.cn/s/blog_8c87ba3b0101m599.html   ARC下,copy到堆上的block,会强引用进入到该block中的外部变量.这很容易导致循环引用的问题. 比方说: 一个VC(这里指一个controller)中有一个属性为model.VC强引用了它. VC --> model 这个model呢,里面有一个copy属性的block,该block赋值如下如下.model.dem

jQuery自定义动画函数实例详解(附demo源码)_jquery

本文实例讲述了jQuery自定义动画函数完整实现技巧.分享给大家供大家参考,具体如下: 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-zdy-dh-move-style-demo/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.d

Android编程实现手绘及保存为图片的方法(附demo源码下载)_Android

本文实例讲述了Android编程实现手绘及保存为图片的方法.分享给大家供大家参考,具体如下: 运行效果图预览: 应 yzuo_08 要求做了此Demo,跟以前那个手写板Demo不同的是可以将画布的内容保存为图片. 附上关键代码: MainView.java package com.tszy.views; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; impor

iOS开发之Block

1.定义 (1) Block是OC中的一种数据类型,在iOS开发中被广泛使用 (2) ^是Block的特有标记 (3) Block的实现代码包含在{}之间 (4) 大多情况下,以内联inline函数的方式被定义和使用 (5) Block与C语言的函数指针有些相似,但使用起来更加灵活 例如: void(^demoBlock)() = ^ {     NSLog(@"demo Block"); }; int(^sumBlock)(int, int) = ^(int x, int y) {

PostgreSQL 类ORACLE RAC 的产品 DEMO实现

亚马逊推出的Aurora数据库引擎,支持一份存储,一主多读的架构.这个架构和Oracle RAC类似,也是共享存储,但是只有一个实例可以执行写操作,其他实例只能执行读操作.相比传统的基于复制的一主多读,节约了存储的成本,网络带宽的成本. 我们可以使用PostgreSQL的hot standby模式来模拟这种共享存储一主多读的架构,但是需要注意几点,hot standby也会对数据库有写的动作,例如recovery时,会修改控制文件,数据文件等等,这些操作是多余的.另外很多状态是存储在内存中的,所

Enterprise Library Policy Injection Application Block 之三:PIAB的扩展—创建自定义CallHandler(提供Source Code下载)

本系列的第一部分对PIAB使用场景进行了简单的介绍,作中阐述了通过PI(Policy Injection)的方式实现了Business Logic和Non-Business Infrastructure Logic的分离,从而实现了AOP(Aspect Oriented Programming).在第二部分中详细介绍PIAB的实现机制:通过自定义RealProxy的方式实现了Method Injection.通过这几天接收到的网友的留言,觉得很多人对在具体的项目开发中如何使用PIAB还有很多困惑

java-求助个Java多线程的demo问题

问题描述 求助个Java多线程的demo问题 public class ThreadDemo { public static void main(String[] args) { new ThreadDemo().run();}public void run() { Family f = new Family(); new Thread(fqizi"").start(); new Thread(fzhangfu"").start(); while (true) {