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

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

推荐阅读更多精彩内容