step 0 Block是什么

block

概念

  • block 是 C 语言的
  • 是一种数据类型,可以当作参数传递
  • 是一组预先准备好的代码,在需要的时候执行

动画 block 回顾

self.demoView.center = CGPointMake(self.view.center.x, 0);

// 此方法会立即执行动画 block

[UIView animateWithDuration:2.0 delay:0 usingSpringWithDamping:0.3 initialSpringVelocity:10 options:0 animations:^{

NSLog(@"动画开始");

self.demoView.center = self.view.center;

} completion:^(BOOL finished) {

// 会在动画结束后执行

NSLog(@"动画完成");

}];

NSLog(@"come here");

block 基本演练

1  最简单的 block

- (void)blockDemo1 {

// 定义block

// 类型 变量名 = 值

void (^block)() = ^ {

NSLog(@"Hello block");

};

// 执行

block();

}

tip :使用 inlineBlock 可以快速定义 block.

  • 当作参数传递

- (void)blockDemo2 {

void (^block)() = ^ {

NSLog(@"Hello block");

};

[self demoBlock:block];

}

///  演示 block 当作参数传递

- (void)demoBlock:(void (^)())completion {

NSLog(@"干点什么");

completion();

}

  • 使用局部变量

- (void)blockDemo3 {

// 栈区变量

int i = 10;

NSLog(@"%p", &i);

void (^block)() = ^ {

// 定义 block 的时候会对栈区变量进行一次 copy

NSLog(@"Hello block %d %p", i, &i);

};

[self demoBlock:block];

}

如果 block 中使用了外部变量,会对外部变量做一次 copy

  • 在 block 中修改外部变量

- (void)blockDemo4 {

// 栈区变量

__block int i = 10;

NSLog(@"%p", &i);

void (^block)() = ^ {

// 定义 block 的时候会对栈区变量进行一次 copy

NSLog(@"Hello block %d %p", i, &i);

i = 20;

};

NSLog(@"block 定义完成 %p %d", &i, i);

[self demoBlock:block];

NSLog(@"===>%d", i);

}

如果要在 block 内部修改栈区变量,需要使用 __block 修饰符,并且定义 block 之后,栈区变量的地址会变化为堆区地址

block 的内存位置

  • 全局区:如果block中没有使用任何全局变量
  • 栈区:如果 block 中使用了外部变量

MRC 模式可以看到

ARC 模式,系统会自动将 Block 复制到堆中

  • 堆区:将 block 设置给 copy 属性

@property (nonatomic, copy) void (^myBlock)();

- (void)blockDemo5 {

int i = 10;

void (^block)() = ^ {

NSLog(@"i --- %d", i);

};

NSLog(@"%@", block);

self.myBlock = block;

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

NSLog(@"%@", self.myBlock);

}

注意:虽然目前 ARC 编译器在设置属性时,已经替程序员复制了 block,但是定义 block时,仍然建议使用 copy 属性

时间: 2024-10-29 14:55:30

step 0 Block是什么的相关文章

step 0 Cocoapods日常(附Alcatraz )

Cocoapods 安装 # 添加源 $ sudo gem sources -a http://ruby.taobao.org/ # 删除源 $ sudo gem sources -r https://rubygems.org/ # 安装 $ sudo gem install cocoapods # 设置 $pod setup 使用 # 搜索 $ pod search AFNetworking # 安装 $ pod install # 升级 $ pod update / ( pod instal

step 0 iOS 多线程

多线程 基本概念 进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 通过 活动监视器 可以查看 Mac 系统中所开启的进程 线程 进程要想执行任务,必须得有线程,进程至少要有一条线程 程序启动会默认开启一条线程,这条线程被称为主线程或UI 线程 线程是进程的基本执行单元,进程的所有任务都在线程中执行 多线程 一个进程中可以开启多条线程,每条线程可以同时执行不同的任务 进程 -> 公司 线程 -> 员工 主线程 -> 老板(第一

分区里的inode号是0号和1号的block

分区里的inode号是0号和1号的block 我相信大家在使用Linux的时候都遇到过误删文件系统数据的情况,不管是自己误删还是帮人家恢复误删 现在用的比较多的恢复工具大概是ext3grep .extundelete 这两个 当然本文不是要说这两个工具的使用方法,而是介绍每个分区里的inode号为0或1号的block到底是什么 在使用ext3grep .extundelete 的时候,基本上都会有这样一个步骤 在Linux下可以通过“ls-id”命令来查看某分区目录的inode值,可以输入: [

poj3009--Curling 2.0(搜索练习1)

Curling 2.0 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2013-02-19) Description On Planet MM-21, after their Olympic games this year, curling is getting popular. Bu

POJ3009——Curling 2.0(DFS)

Curling 2.0 DescriptionOn Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use only a single

POJ 3009 Curling 2.0 {广度优先搜索}

原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use only a single stone. The purpose

【JavaScript 封装库】BETA 4.0 测试版发布!

1 /* 2 源码作者: 石不易(Louis Shi) 3 联系方式: http://www.shibuyi.net 4 =================================================================================================== 5 程序名称: JavaScript 封装库 BETA 4.0 版 6 迭代版本: BETA 3.0 7 插件总数: 12 个 8 库方法数: 26 个 9 功能总数: 67 个

(hdu step 3.2.6)Monkey and Banana(在第一关键字有序的情况下,根据第二关键字求最长上升子序列的高度之和)

题目: Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 720 Accepted Submission(s): 455   Problem Description A group of researchers are designing an experiment to test the IQ of a m

01原始编译r16的tinav2.5(分色排版)V1.0

01原始编译r16的tinav2.5 2017/12/14 11:44 版本:V1.0 0.(可选)验证一下SDK的MD5值! [email protected]:/home/wwt$ [email protected]:/home/wwt$ md5sum tinav2.5_20171205.tar.gz 17295b52f2cc5d3a8d75274e85961923  tinav2.5_20171205.tar.gz [email protected]:/home/wwt$ 1.原始编译r4