一、声明和定义

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小常识:
  1. block是不是对象?是的。在文档working with blocks中可以看到。

  2. MRC开发习惯:访问属性或者设置属性,必须使用点语法,不要使用下划线.

  3. 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的常见用法的更多相关文章

  1. Objective-C中Block的常见用法

    typedef int(^AddValue)(int,int); int main(int argc, const char * argv[]) { @autoreleasepool { //1:NS ...

  2. Linux中find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  3. find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  4. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  5. iOS开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  6. [转]Linux中find常见用法示例

    Linux中find常见用法示例[转]·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;find命令的参 ...

  7. [HMLY]9.深入浅出-iOS Reactive Cocoa的常见用法

    简介 今天的主角是Reactive Cocoa,聊聊Reactive Cocoa的常见使用:KVO.Target.Delegate.Notification. Reactive Cocoa 是一个重量 ...

  8. iOS开发多线程篇 08 —GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  9. iOS-Reactive Cocoa的常见用法

    今天是周末,临近年底,工作上遇到不可抗力,会有点一些变动!这多少会让人有一点静不下来,但需克制,Reactive Cocoa是今天的主角! 废话不多说,今天聊聊Reactive Cocoa的常见使用! ...

随机推荐

  1. jquery写的ajax

    1.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8& ...

  2. 解决VS2012编写JQuery代码不能智能提示的问题(其他js库的代码提示设置估计类似)

    VS默认设置下编写jQuery代码是这样的: 解决办法: 1.在项目的"管理NuGet程序包"中安装JQuery: 2.打开:工具 -> 选项 -> 文本编辑器 -&g ...

  3. 机器学习之KNN算法思想及其实现

    从一个例子来直观感受KNN思想 如下图 , 绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形 ...

  4. Java中如何克隆集合——ArrayList和HashSet深拷贝

    编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法.需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味 ...

  5. kaggle数据挖掘竞赛初步--Titanic<派生属性&维归约>

    完整代码: https://github.com/cindycindyhi/kaggle-Titanic 特征工程系列: Titanic系列之原始数据分析和数据处理 Titanic系列之数据变换 Ti ...

  6. [转载]来,让我们谈一谈Normalize.css

    来源 : http://segmentfault.com/a/1190000002239676 ---------------------------------------------------- ...

  7. sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding

    1 概述 这是基于开源的sphinx全文检索引擎的架构代码分析,本篇主要描述index索引服务的分析.当前分析的版本 sphinx-2.0.4 2 index 功能 3 文件表 4 索引文件结构 4. ...

  8. JS实现 点击button(copy) 复制对应的网址——类似于复制推广链接

    <form action=""> <input type="text" class="share-input" value ...

  9. Scala 的确棒

    我的确认为计算机学院应该开一门 Scala 的语言课程. 在这篇文章中,我会讲述为什么我会有这样的想法,在此之前,有几点我想要先声明一下: 本文无意对编程语言进行评比,我要讲述的主体是为什么你应该学习 ...

  10. Linux 下使用Visual Studio Code

    1.下载:https://az764295.vo.msecnd.net/stable/db71ac615ddf9f33b133ff2536f5d33a77d4774e/VSCode-linux-x64 ...