Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现.

1.Block语法总结及示例如下:

        //1.普通代码块方式block

    returnType (^blockName)(parameterTypes) = ^returnType(parameters) {

        // block code

    };

    使用未例:

    int (^abc)(int a) = ^int(int a){

        return a+1;

    };

    int aa = abc(2);

    NSLog(@"%d",aa);

    //2.属性方式block

    @property (nonatomic, copy) returnType (^blockName)(parameterTypes);

    使用示例:

    1.定义属性

    @property (nonatomic,copy) int (^testblock)(NSString *);

         2.设置使用属性

         [self setTestblock:^int(NSString *a) {

        return 0;

    }];

 

 

    //3.方法参数block

    - (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName {

        // block code

    };

    使用示例1:

    1.无参数型定义及实现:

    - (void)testBlockFun:(void(^)())completion{

     NSLog(@"执行");

        if (completion) { 

           completion();

        }

    }

    2.无参数型block调用:

    [self testBlockFun:^{

        NSLog(@"回调结束");

    }];

 

    使用示例2:

        1.带参数型定义及实现:

        - (void)testBlockFun:(int (^)(int a,int b))complate{

        if (complate) {

            int c = complate(3,5);

            NSLog(@"c:%d",c);

        }

    }

    2.带参数型block调用:

    [self testBlockFun:^int(int a, int b) {

        return a+b;

    }];

 

    // 4.作为参数

    [someObject someMethodThatTakesABlock: ^returnType (parameters) {

        // block code

    }];

    使用示例:

    1.定义及实现

    - (void) testBlockFun:(void (^)(NSString *))complate{

        if (complate) {

            complate(@"success");

        }

    }

    2.调用

    [self testBlockFun:^(NSString *str) {

       NSLog(@"str:%@",str);

   }];

 

    // 5.使用 typedef 定义

   typedef returnType (^TypeName)(parameterTypes);

 

   TypeName blockName = ^(parameters) { 

   };

   使用示例:

   typedef void (^blockTestName)(NSString *);

   调用:

   [self setName:^(NSString *a){

   }];

 

2.Block修改值:使用__block可以在block内部修改外部变量的值。

    __block int someIncrementer = 0;

   [someObject someMethodThatTakesABlock:^{

         someIncrementer++;

   }];

 

3.Block循环引用,block会持有对象,block的对象也有block,会造成block的循环引用,解决方法:

    __weak typeof(self) weakSelf = self;//@weakify(self); 

    [self someMethodThatTakesABlock:^{

        [weakSelf action]; 

    }];

Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现.的更多相关文章

  1. Delegate, NSNotification, KVO, Block

    delegate: 当我们第一次编写iOS应用时,我们注意到不断的在使用“delegate”,并且贯穿于整个SDK.delegation模式不是iOS特有的模式,而是依赖与你过去拥有的编程背景.针对它 ...

  2. BlocksKit初见:一个支持将delegate转换成block的Cocoa库

    简介 项目主页: https://github.com/zwaldowski/BlocksKit BlocksKit 是一个开源的框架,对 Cocoa 进行了扩展,将许多需要通过 delegate 调 ...

  3. block存储区域——怎样验证block在栈上,还是堆上

    Block存储区域 首先,须要引入三个名词: ● _NSConcretStackBlock ● _NSConcretGlobalBlock ● _NSConcretMallocBlock 正如它们名字 ...

  4. block本质探寻三之block类型

    一.oc代码 提示:看本文章之前,最好按顺序来看: //代码 void test1() { ; void(^block1)(void) = ^{ NSLog(@"block1----&quo ...

  5. 环境变量、block、修饰符:block对环境变量的引用和修改需要通过修饰符来限定

    环境变量.block.修饰符:block对环境变量的引用和修改需要通过修饰符来限定. http://www.cnblogs.com/fengmin/p/5816580.html - (NSUInteg ...

  6. Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)

    需求:在ViewController中,点击Button,push到下一个页面NextViewController,在NextViewController的输入框TextField中输入一串字符,返回 ...

  7. 63.delegate回调 和block回调

    效果:viewController里面放置一个按钮和Lab,点击按钮进入oneViewController(delegate回调)或者BlockViewController(block回调),两者控制 ...

  8. 【转】block一点也不神秘————如何利用block进行回调

    我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...

  9. [置顶] block一点也不神秘————如何利用block进行回调

    我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...

随机推荐

  1. final关键字介绍

    许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”.常数主要应用于下述两个方面: (1) 编译期常数,它永远不会改变 (2) 在运行期初始化的一个值,我们不希望它发生变化 对于编译期的常数,编 ...

  2. Cocos2d-js 开发记录:Loading载入界面自定义

    Loading界面是一个cc.Scene具体请看: http://blog.csdn.net/jonahzheng/article/details/38348255 如果仅仅是想把图片(cocos l ...

  3. scss-@import

    css有一个特别不常用的特性,即@import规则,它允许在一个css文件中导入其他css文件.然而,后果是只有执行到@import时,浏览器才会去下载其他css文件,这导致页面加载起来 特别慢. s ...

  4. SQLAlchemy的使用---增删改查

    #通过SQLAlchemy对数据库进行增删改查 # 想要操作数据库 先要打开数据库连接 from create_table import engine # 创建会话 - 打开数据库连接 from sq ...

  5. 前端给div加滚动条样式修改

    <!DOCTYPE html> <html lang="en">       <head>             <meta chars ...

  6. abc098D Xor Sum 2(two point)

    题意 题目链接 给出一个序列,求出有多少区间满足\(A[l] \oplus A[l+1] \oplus \dots \oplus A[r] = A[l] + A[l + 1] +\dots+ A[r] ...

  7. drupal 学习思路

    我之前没有学习过框架,用过一个简单的cms.php工作经验有大半年.独立项目经验为0.5.目前在用drupal,用了有三个月,主要是用drupal写app的后台管理和api接口.公司在drupal的基 ...

  8. 01.IDEA常用快捷键

    [1.查找] 当前窗口基本查找 ----------- Ctrl + F 返回上次浏览的位置 ----------- Ctrl + Alt + Left 查找类 ----------- Ctrl + ...

  9. 《ArcGIS Runtime SDK for Android开发笔记》——数据制作篇:发布具有同步能力的FeatureService服务

    1.前言 从ArcGIS 10.2.1开始推出离在线一体化技术之后,数据的离在线一体化编辑一直是大家所关注的一个热点.数据存储在企业级地理数据库中,通过ArcGIS桌面软件加载后配图处理,并发布到Ar ...

  10. python 正则,os,sys,hashlib模块

    简单的小算法 random随机获取数据 import random def getrandata(num): a=[] i= while i<num: a.append(random.randi ...