摘自:http://www.cnblogs.com/ltpblog/p/3684127.html

Date : 2015-12-4

1. Block定义

1) 说明:

a. Block是OC中的一种数据类型,在iOS开发中被广泛使用
b. ^是Block的特有标记
c. Block的实现代码包含在{}之间
d. 大多情况下,以内联inline函数的方式被定义和使用
e. Block与C语言的函数指针有些相似,但使用起来更加灵活
 
2)  格式:
(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现}
注:如果没有参数,等号后面的参数列表可以删除。
 
3)例子:
(void) (^myBlock)(int, int) = ^(int a, int b) {
  return a + b;
}
 
2. Block需要注意的问题

问题一:

Block可以使用在定义之前声明的局部变量

int i = 10;

void(^myBlock)() = ^{

NSLog(@"%d", i);

};

i = 100;

myBlock();

该段代码的输出结果为10.
注意:
a. 在定义Block时,会在Block中建立当前局部变量内容的副本(拷贝)
b. 后续再对该变量的数值进行修改,不会影响Block中的数值
c. 如果需要在block中保持局部变量的数值变化,需要使用__block关键字
d. 使用__block关键字后,同样可以在Block中修改该变量的数值
 

问题二:

block可以使用block之前的局部变量,但是不能对其进行修改。

BOOL flag = NO;

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

if ([@"王五" isEqualToString:obj] || idx == stopIndex) {

*stop = YES;

flag = YES;      // 编译错误!!!

}

}];

上述代码编译时,有语法错误。
注意:
1. 默认情况下,Block外部的变量,在Block中是只读的。
2. 如果需要修改外表变量的值,需要在声明变量时加上__block关键字。
 

问题三:

传递对象

NSString *stopName = @"王五";

NSArray *array = @[@"张三", @"李四", @"王五", @"赵六"];

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

NSLog(@"第 %d 项内容是 %@", (int)idx, obj);

if ([stopName isEqualToString:obj] || idx == stopIndex) {

*stop = YES;

}

}];

注意:

为保证Block中的代码正常运行,在将stopName的指针传递给Block时,Block会自动对stopName的指针做强引用。
 

问题四:

循环引用

@property (nonatomic, strong) NSMutableArray *myBlocks;

#pragma mark 将代码改为调用self的方法

int(^sum)(int, int) = ^(int x, int y) {

return [self sum:x y:y];

};

[self.myBlocks addObject:sum];

#pragma mark 对象被释放时自动调用

- (void)dealloc

{

NSLog(@"DemoObj被释放");

}

注意: 
1. 循环引用的结果就是对象无法被释放。
2. 局部变量默认都是强引用的,离开其所在的作用域之后就会被释放。
3. 使用__weak关键字,可以将局部变量声明为弱引用

__weak DemoObj *weakSelf = self;

在Block中引用weakSelf,则Block不会再对self做强引用

int(^sum)(int, int) = ^(int x, int y) {

return [weakSelf sum:x y:y];

};

推荐:

ios block常见的错误(一)

ios block常见的错误(二)——循环引用

ios block常见的错误(三)——并发编程的block引用

Object-c : block需要注意的几点问题的更多相关文章

  1. iOS通知中心升级 -可设置按优先级执行block

    简单介绍下,这是需求驱动中发现iOS的NotificationCenter有很多功能无法实现,于是对其进行了一层包装.相当于手动管理观察者栈和监听者期望执行的事件,因此可以为其添加了很多新增的功能,将 ...

  2. block的语法

    主要内容: 1. 开始使用block(Getting Started with Blocks) 2. block概念综述(Conceptual Overview) 3. 声明和创建block(Decl ...

  3. Core Java Volume I — 4.6. Object Construction

    4.6. Object ConstructionYou have seen how to write simple constructors that define the initial state ...

  4. ios专题 -block用法

    what is block Blocks are a language-level feature added to C, Objective-C and C++, which allow you t ...

  5. (译文)IOS block编程指南 3 概念总览

    Conceptual Overview(概览) Block objects provide a way for you to create an ad hoc function body as an ...

  6. 简洁的KVO -- 使用Block响应事件

    涉及内容: KVO,Runtime,Category,Block 首先创建NSObject的Category 举个例子是这样的: 随后定义你需要响应的Block结构 我简单一点就这样咯 typedef ...

  7. 【原】iOS学习之PINCache第三方缓存框架

    在项目中总是需要缓存一些网络请求数据以减轻服务器压力,业内也有许多优秀的开源的解决方案.通常的缓存方案都是由内存缓存和磁盘缓存组成的,内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化. 1.PINC ...

  8. Functional Programming without Lambda - Part 2 Lifting, Functor, Monad

    Lifting Now, let's review map from another perspective. map :: (T -> R) -> [T] -> [R] accep ...

  9. 相克军_Oracle体系_随堂笔记005-Database buffer cache

    本章主要阐述SGA中的Database buffer cache. Buffer cache { 1.pin (读写瞬间的状态) 2.clean 3.dirty 4.unused } --Databa ...

  10. IOS开发基础知识--碎片28

    1:通用的weakify和strongify /** * 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题 * 调用方式: `@weakify_self`实现弱引用转换,` ...

随机推荐

  1. PL/SQL快捷键

    F8 执行所选中的SQL语句 当光标在sql语句末尾/开头 时 按Shift  Home /Shift  End 选中该语句

  2. datatables中columns.render的使用

    可直接在columns申明中对应列下方使用render改变该列样式 也可单独在columnsDefs中用targets指定目标. "render":function(data,ty ...

  3. ctl 里面pdef解说

    WRF 模式MM5 模式都是目前从网上可以下载的气象软件,因此在国内经常可以见到.但这两种模式的数据特点数据的水平网格都不是标准的经纬度网格.需要在ctl 文件中加入PDEF 定义说明把这种非标准的数 ...

  4. spring.xml命名空间

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...

  5. Mysql query log

    一.查询日志的概念: 查询日志记录MySQL中所有的query,通过"--log[=file_name]"来打开该功能.由于记录了所有的query,包括所有的select,体积比较 ...

  6. 怎样新建Oracle数据库

    新建Oracle数据库三种方法:1.通过运行Oracle Database Configuration Assistant 创建配置或删除数据库(也可在命令行下输入dbca):2.用命令行的方式建立数 ...

  7. char 型变量中能不能存贮一个中文汉字,为什么?

    char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个 ...

  8. java面试每日一题8

    题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1 ...

  9. poj1811 Prime Test

    http://poj.org/problem?id=1811 #include <cstdio> #include <cstring> #include <algorit ...

  10. Maya Calendar 分类: POJ 2015-06-11 21:44 12人阅读 评论(0) 收藏

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 70016   Accepted: 21547 D ...