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

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]; 

    }];

时间: 2024-08-04 16:52:05

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

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

简单介绍 项目主页: https://github.com/zwaldowski/BlocksKit BlocksKit 是一个开源的框架,对 Cocoa 进行了扩展.将很多须要通过 delegate 调用的方法转换成了 block.在非常多情况下.blocks 比 delegate 要方便简单.由于 block 是紧凑的,能够使代码简洁.提高代码可读性.另外 block 还能够进行异步处理.使用 block 要注意避免循环引用. 文件夹结构 BlocksKit 的全部方法都以bk_开头,这样能

block存储区域——如何验证block在栈上,还是堆上

block存储区域 这就需要引入三个名词: ● _NSConcretStackBlock ● _NSConcretGlobalBlock ● _NSConcretMallocBlock 正如它们名字说的那样,说明了block的三种存储方式:栈.全局.堆. [要点1]定义在函数外面的block是global的:另外如果函数内部的block,但是没有捕获任何自动变量,那么它也是全局的.比如下面这样的代码: typedef int (^blk_t)(int); for(...){ blk_t blk

nand出现大片的Bad block at 0x in erase block from 0x will be skipped

开发板上的nand flash写不了,擦除不了: Bad block at 0xxxxx in erase block from 0xxxxx will be skipped …… 解决方法: nand scrub $(offset) $(size) y enter 删除标记的坏块,这样就把整个flash格式化了.

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

我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我只好让手机开始充电 4.充电的过程中我好无聊,我要去看电视,但是我不会一直看电视,我要等手机电充满了停止看电视,继续去玩手机 5.我开始看电视 6.手机电充好了,我听到手机响了一下,我不看电视了我继续去玩手机. 这个场景中哪里跟回调类似 呢?哪里跟通知类似呢?其实我们可以认为手机充好电了通过回调的方

OC --(6)-- Block、数组高级:Block语法、Block使用、Block实现数组排序

1.Block定义 Block:块语法,本质上是匿名函数(没有名称的函数) 标准C?里?面没有Block,C语言的后期扩展版本,加入了匿名函 数. C++.JS.Swift等语?言,有类似语法,叫做闭包. Block语法和函数指针很相似.

Block使用详解,Block与代理相比的优点

Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性. Block是Apple Inc.为C.C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包. 闭包就是能够读取其它函数内部变量的函数.就是在一段请求连续代码中可以看到调用参数(如发送请求)和响应结果.所以采用Block技术能够抽象出很多共用函数,提高了代码的可读性,可维护性,封装性. 不像代理声明了一个代理函数,在调用的类内部还要实现该函数,让

Block系列1:初识block

//-------1.定义函数----- //1.函数 int sum(int a,int b) { return a+b; } //------------------2.声明--------- //2.声明函数指针[将sum换成*p就可以了] int (*p)(int a,int b); //(1)声明block[将sum换成^myBlock就可以了] int (^myBlock)(int a,int b); //举一反三 void (^myBlock2)(void); - (void)vi

【iOS开发-117】block为什么用copy?利用runtime运行时的objc_方法为分类扩充成员变量

(1)block - (void)viewDidLoad { [super viewDidLoad]; __block int a=10; NSLog(@"a=%d",a); void (^blockName)()=^{ a=20; }; NSLog(@"a=%d",a); blockName(); NSLog(@"a=%d",a); } --以上输出结果是10,10,20. --只要在变量前面增加__block,在block里面就可以修改该变量

iOS代码实践总结

转载地址:http://mobile.51cto.com/hot-492236.htm 最近一个月除了专门抽时间和精力重构之外,还有就是遇到需要添加功能的模块的时候,由于项目中的代码历史因素比较多,第一件干的事情往往是重构整理代码,发现很多之前的代码写的时候没有注意的事情特别多,比如全局变量乱用:方法没有层次感,胡乱添加:对业务不了解的情况下,通过打补丁的方式实现功能等等. AD: 前几个月完成对MVVM/RAC的学习之后,最近一直在默默地对项目代码进行重构,写码比较多,过了一段时间回头发现自己