block的常见用法
一、声明和定义
1、声明
声明方式:返回值(^block)(参数)。声明时,参数变量名可以省略;使用时,参数变量名不能省略,不然会无法调用传入的参数
void(^block)();
void(^block)(int);
int(^block)(int);
2、定义
- 无参无返回值。可以省略写
void(^block)() = ^{};
void(^block)() = ^(){};
- 有参无返回值。
void(^block)(int) = ^(int a){};
- 有参有返回值。返回值可以省略,也可以不省略
int(^block)(int) = ^int(int a){};
int(^block)(int) = ^(int a){};
二、简单使用场景
保存一段代码,在不同方法中调用
@interface ViewController ()
@property (nonatomic, strong) void(^block)();
@end - (void)viewDidLoad {
[super viewDidLoad];
void(^block)() = ^{
NSLog(@"调用Block");
};
_block = block;
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
_block();
}
使用技巧:
inlineBlock:快速生成block代码
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
<#statements#>
};
三、逆向传值
在数据来源的第二个文件中,定义一个block变量,放入需要传递的值
#import <UIKit/UIKit.h>
@class modalViewController; @interface modalViewController : UIViewController
@property(nonatomic,strong)void (^valueBolck)(NSString *value);
@end -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
if (_valueBolck) {
_valueBolck(@"123");
}
[self dismissViewControllerAnimated:YES completion:nil];
}
在modal回来的需接受数据的文件中,导入数据源文件,并接收值
#import "ViewController.h"
#import "modalViewController.h" -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
modalViewController *mVC = [[modalViewController alloc]init];
mVC.valueBolck = ^(NSString *value){
NSLog(@"%@",value);
};
[self presentViewController:mVC animated:YES completion:nil];
}
四、MRC和ARC下block存放区域的区别
1、MRC下的block
- 情形一:如果block没有访问外部的局部变量,或者访问的外部局部变量被static修饰过,那么block默认存在于全局区(Global)。可以retain,可以copy。copy后依然存在全局区中。
- 情形二:如果block访问外部的局部变量,那么block存放在栈(Stack)中。此时,如果block声明为成员变量,不能使用retain,因为此时依然放在栈里面,会自动销毁。需要用copy声明。此种情况下copy后的block,放在堆(Malloc)里面。
- MRC小常识:
block是不是对象?是的。在文档working with blocks中可以看到。
MRC开发习惯:访问属性或者设置属性,必须使用点语法,不要使用下划线.
MRC没有强指针,默认一个对象就是基本类型
2、ARC下的block
- 情形一:如果block没有访问外部的局部变量,或者访问的外部局部变量被static修饰过,那么block默认存在于全局区(Global)。可以weak,可以strong。此后的block依然存在于全局区中。
- 情形二:如果block访问外部的局部变量,那么block存放在堆(Malloc)中。此时,如果block声明为成员变量,不能使用weak,因为此时没有强指针指向,会自动销毁。strong后重新调用的block存在于堆(Malloc)中。
- 所以,不要用weak修饰ARC下的block
五、block的值传递
1、默认block访问外部局部变量没有被任何关键字修饰,都是值传递
2、bolck访问外部变量被__block、static,指针传递
3、访问的全局变量,也是指针传递
(关于__bolcok,待补充)
六、bolcok开发使用场景
block开发使用场景(参数适用):
什么时候使用blcok充当参数?
思想:封装一个功能,这个功能做什么事情由外界决定,但是什么时候调用由内部决定,这时候就需要把block充当一个参数去使用。
链式编程思想:把方法调用通过点语法链接,可读性非常好。
blcok方式实现举例:
-(CaculatorViewController *(^)(int))add{
return ^(int value){
_result += value;
return self;
};
}
(缓慢更新中...)
block的常见用法的更多相关文章
- Objective-C中Block的常见用法
typedef int(^AddValue)(int,int); int main(int argc, const char * argv[]) { @autoreleasepool { //1:NS ...
- Linux中find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- iOS 开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- [转]Linux中find常见用法示例
Linux中find常见用法示例[转]·find path -option [ -print ] [ -exec -ok command ] {} \;find命令的参 ...
- [HMLY]9.深入浅出-iOS Reactive Cocoa的常见用法
简介 今天的主角是Reactive Cocoa,聊聊Reactive Cocoa的常见使用:KVO.Target.Delegate.Notification. Reactive Cocoa 是一个重量 ...
- iOS开发多线程篇 08 —GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS-Reactive Cocoa的常见用法
今天是周末,临近年底,工作上遇到不可抗力,会有点一些变动!这多少会让人有一点静不下来,但需克制,Reactive Cocoa是今天的主角! 废话不多说,今天聊聊Reactive Cocoa的常见使用! ...
随机推荐
- HTML5部分新标签属性及DOM扩展元素
HTML5定义了一系列新元素,如新语义标签.智能表单.多媒体标签等. 我们日常讨论的H5其实是一个泛称,它指的是由HTML5 + CSS3 + Javascript等技术组合而成的一个应用开发平台. ...
- Evolutionary Computing: Assignments
Assignment 1: TSP Travel Salesman Problem Assignment 2: TTP Travel Thief Problem The goal is to find ...
- html的a链接的href怎样才另起一个页面
在后面加上target ="_blank",就可以,正如: <ul class="nav navbar-nav navbar-right" style=& ...
- Ajax聊天
结构: index.html <!DOCTYPE html> <html> <head> <title>index.html</title> ...
- 谈谈javascript中的日期Date对象
一.日期对象 在javascript中并没有日期型的数据类型,但是提供了一个日期对象可以操作日期和时间. 日期对象的创建: new Date();二.将日期对象转换为字符串 将日期对象转换为字 ...
- 用原生js获取class
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Java-用switch判断季节
import java.util.*;class Demo3 { public static void main(String[] args) { //需求 :输入一个月份 ,判断月份属于哪一个季节 ...
- Unity3D 中的定时器
不算上 C# 自带的,目前知道两种,以下分别介绍. 1.每帧检查 定义一个时间变量 timer,每帧将此时间减去帧间隔时间 Time.deltaTime,如果小于或者等于零,说明定时器到了,执行相应功 ...
- 8bit YUV4:2:2格式对应的颜色
红色:YCR YCB YCR YCB....分别为:51e6 515d 51e6 515d 绿色:YCR YCB YCR YCB....分别为:512b 513c 512b 513c 蓝色:YCR Y ...
- 代码成长记录之jquery this使用
后台管理的一个项目,第一次主动尝试自己动手写交互,果然问题来了,之前想当然觉得自己能写,不动笔,真的是对自己不负责任啊! 效果图是这样的,按我的思维写下来是点击一个‘更改’ 多个地方会同时触发下拉 ...