Objective-C( block的使用)
block
block用来保存一段代码
block的标志:^
block跟函数很像:可以保存代码、有返回值、有形参、调用方式跟调用方法一样
block内部可以访问外面的变量
默认情况下,block内部不能修改外面的局部变量
给局部变量加上__block关键字,这个局部变量就可以在block内部修改
block助记符 inlineBlock
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
<#statements#>
};
利用typedef定义block类型
typedef int (^MyBlock)(int, int);
以后就可以利用MyBlock这种类型来定义block变量
MyBlock block;
MyBlock b1, b2;
没有返回值、没有形参的block
- int main()
- {
- // 定义block变量
- void (^myblock)() =^(){
- NSLog(@"-------");
- NSLog(@"-------");
- NSLog(@"-------");
- };
- // 如果block没有形参就可以省略后面的小括号()
- void (^llblock)() =^{
- NSLog(@"-------");
- NSLog(@"-------");
- NSLog(@"-------");
- };
- // 调用block内部代码
- myblock();
- // 利用block变量调用block内部的代码
- llblock();
- return ;
- }
有形参、有返回值的block
- int main()
- {
- int (^sumblock)(int, int) = ^(int a, int b){
- return a + b;
- };
- int c = sumblock(, );
- NSLog(@"%d", c);
- // 用一个block输出n条横线
- void (^lineBlock)(int) = ^(int n)
- {
- for (int i = ; i<n; i++) {
- NSLog(@"----------------");
- }
- };
- lineBlock();
- return ;
- }
以下是借鉴,拷贝的博文
二、内存位置(ARC情况)
1、block块的存储位置(block块入口地址):可能存放在2个地方:代码区、堆区(程序分5个区,还有常量区、全局区和栈区,对于MRC情况下代码还可能存在栈区。关于分区详细参考:http://www.cnblogs.com/mddblog/p/4405165.html
情况1:代码区
不访问处于栈区的变量(例如局部变量),且不访问处于堆区的变量(例如alloc创建的对象)。也就是说访问全局变量也可以。

- /**
- 没有访问任何变量
- */
- int main(int argc, char * argv[]) {
- void (^block)(void) = ^{
- NSLog(@"===");
- };
- block();
- }


- /**
- 访问了全局(静态)变量
- */
- int iVar = 10;
- int main(int argc, char * argv[]) {
- void (^block)(void) = ^{
- NSLog(@"===%d",iVar);
- };
- block();
- }

情况2:堆区
如果访问了处于栈区的变量(例如局部变量),或处于堆区的变量(例如alloc创建的对象)。都会存放在堆区。(实际是放在栈区,然后ARC情况下自动又拷贝到堆区)

- /**
- 访问局部变量
- */
- int main(int argc, char * argv[]) {
- int iVar = 10;
- void (^block)(void) = ^{
- NSLog(@"===%d",iVar);
- };
- block();
- }

2、注意事项
代码存放在堆区时,就需要特别注意,因为堆区不像代码区不变化,堆区是不断变化的(不断创建销毁)。因此代码有可能会被销毁(当没有强指针指向时),如果这时再访问此段代码则会程序崩溃。因此,对于这种情况,我们在定义一个block属性时应指定为strong,或copy:
@property (nonatomic, strong) void (^myBlock)(void); // 这样就有强指针指向它
@property (nonatomic, copy) void (^myBlock)(void); // 并不会在堆区copy一份,原因见 三
而对于第1种情况(代码存在代码区),使用strong,copy(不会复制一份到堆区)也可以。因此定义block时最好指定为strong(推荐)或copy。
3、指定为copy后是否会拷贝一份呢?(或者说是浅拷贝还是深拷贝)
1 copy可变变量:在赋值指针的同时也会复制指针指向的内存区域。深拷贝,例如NSMutableString对象。
2 copy不可变变量:等同于strong,还是浅拷贝,例如NSString对象。
因为block是一段代码,即不可变的,所以并不会深拷贝。
Objective-C( block的使用)的更多相关文章
- Objective C block背后的黑魔法
前言 block在Objective C开发中应用非常广泛,我们知道block会捕获外部对象,也知道使用block要防止循环引用. "知其然而不知其所以然"是一件非常痛苦的事情,那 ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- 初学Objective - C语法之代码块(block)
一.block声明 1.无参数,无返回值: void (^sayHi)(); 2.有参数,有返回值: NSInteger (^operateOfValue)(NSInteger num); block ...
- Objective的字符串拼接 似乎没有Swift方便,但也可以制做一些较为方便的写法
NSString *str1 = @"字符串1"; NSString *str2 = @"字符串2"; //在同样条件下,Objective的字符串拼接 往往只 ...
- Objective C ARC 使用及原理
手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档过程中的疑问和答案写下来.下面有些是翻译,但 ...
- iOS Block详细介绍(block实现)
Block的实现 数据结构定义 block的数据结构定义如下图 对应的结构体定义如下: struct Block_descriptor { unsigned long int reserved; un ...
- @weakify, @strongify ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
- 堆block和栈block的区分
0. 问题所在 下面给出一段代码: - (NSArray*) getBlockArray { int num = 916; return [[NSArray alloc] initWithObject ...
- ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
随机推荐
- RFC-2068-http
本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善.请参考 “互联网官方协议标准”(STD 1)来了解本协议的标准化状态.本协议不限流传发布. 版权声明 Copyright (C) Th ...
- Android组件间交互
四大组件相信大家都不陌生了吧,今天咱们就组件间通信做个说明: 首先: 主要今天的目的是为了说明Android 提供的一个ResultReceiver类,这个类相信大家都不陌生吧>?但是你们层深入 ...
- 4.用PHP打印出前一天的时间格式是2006-5-10 22:21:21
echo date('Y-m-d H:i:s', strtotime('-1 days'));
- 开发环境中biztalk项目设置注意事项(转)
适用版本:biztalk 2006 适用环境:开发测试环境 在开发过程中,在开发环境中,一定会是一个对项目不断的修改.编译.部署.测试,查看测试结果,发现有问题,然后回到开发环境再修改.编译.部署 ...
- jsp 环境配置记录
1. jdk,下载地址1 环境变量配置: 1)新建 JAVA_HOME 变量 . 变量值填写jdk的安装目录(本人是 C:\Java\jdk1.7.0) 2) 系统变量→寻找 Path 变量→编辑 ...
- Java语言的特点
一. 面向对象:其实是现实世界模型的自然延伸.现实世界中任何实体都可以看作是对象.对象之间通过消息相互作用.另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例.如果说传统的过程式 ...
- 关于Block的copy和循环引用的问题
http://blog.csdn.net/felix9/article/details/9619313 在实际开发中,发现使用Block有着比delegate和notification更简洁的优势.于 ...
- this的面面观
http://www.cnblogs.com/Wayou/p/all-this.html <JavaScript语言精粹> 全局this 浏览器宿主的全局环境中, function f(x ...
- Python—进程、线程、协程
一.线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 方法: ...
- [问题2014A02] 解答一(两次升阶法,由张钧瑞同学、董麒麟同学提供)
[问题2014A02] 解答一(两次升阶法,由张钧瑞同学.董麒麟同学提供) 将原行列式 \(|A|\) 升阶,考虑如下 \(n+1\) 阶行列式: \[|B|=\begin{vmatrix} 1 &a ...