美文网首页
Block作为属性、方法参数、返回值的一些用法

Block作为属性、方法参数、返回值的一些用法

作者: panda_熊猫 | 来源:发表于2017-10-11 14:59 被阅读59次

    block代码块主要用于对象之间的通信(反向传值和方法传递)。

    首先,我们从内存管理方面来了解一下block

    block:我们称代码块,他类似一个方法。而每一个方法都是在被调用的时候从硬盘到内存,然后去执行,执行完就消失,所以,方法的内存不需要我们管理,也就是说,方法是在内存的栈区。所以,block不像OC中的类对象(在堆区),他也是在栈区的。如果我们使用block作为一个对象的属性,我们会使用关键字copy修饰他,因为他在栈区,我们没办法控制他的消亡,当我们用copy修饰的时候,系统会把该 block的实现拷贝一份到堆区,这样我们对应的属性,就拥有的该block的所有权。就可以保证block代码块不会提前消亡。


    1.Block作为对象的属性:

      我们首先来定义一个类,此处简单定义一个Person类,在Person类中的.h文件中声明一个myblock属性如下:

    之后再ViewController里面 创建person对象 

    Person *person = [[Person alloc] init];

    // 1 block当做属性

    person.myblock = ^(NSString *str) {

    NSLog(@"这个人笑了: %@",str);

    };


    2.Block作为方法的参数:

    方法名叫saySomething,参数名为block、类型为block的方法(block本身参数为NSString类型),声明代码如下:

    // 2.  Block作为方法的参数:

    - (void)saySomething:(myblock)block;

    person.m中实现方法

    - (void)saySomething:(myblock)block{

    block(@"哈哈哈哈嗝");

    }

    之后再ViewController里面调用

    // 2.block 当做参数

    [person saySomething:^(NSString *str) {

    NSLog(@"说点什么吧: %@",str);

    }];


    3.Block作为返回值:

    返回值,当我们使用带有返回值类型的方法时,当然是把定义方法的返回类型,声明为block类型,代码如下:

    // 3. Block作为返回值:

    - (myblock)sayhello

    person.m中实现方法

    - (myblock)sayhello{

    return ^(NSString *str){

    NSLog(@"hello nihao %@",str);

    };

    }

    之后再ViewController里面调用

    // 3 block 当做返回值

    person.sayhello(@"你好");

    本文demo

    本文demo

    相关文章

      网友评论

          本文标题:Block作为属性、方法参数、返回值的一些用法

          本文链接:https://www.haomeiwen.com/subject/nnlwyxtx.html