Object-c : block需要注意的几点问题

摘自: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引用

时间: 2024-07-29 09:03:33

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

iOS 8:【转】Block循环引用

源地址:http://fann.im/blog/2013/04/17/retain-cycle-in-blocks/ 个人笔记,可能会有理解不够透彻而错误. @fannheyward Objective-C 是基于引用计数(retainCount)来做内存管理,ClassA 用到 ClassB 的时候,通过 alloc/retain/copy 等将 objectB.retainCount+1,不需要的时候通过 release/autorelease 将 objectB.retainCount-1

iOS中-Block使用

Block对象是 C 级别的语法和运行时特性.它们和标准 C 函数很类似,但是除了可执行代码外,它们还可能包含了变量自动绑定(栈)或内存托管(堆).所以一个block维护一个状态集(数据),它们可以在执行的时候用来影响程序行为. 你可以用 blocks来编写函数表达式,这些表达式可以作为 API 使用,或可选的存储,或被多个线程使用.Blocks作为回调特别有用,因为block携带了进行回调所需要的执行代码和执行过程中需要的数据. Blocks在GCC和Clang里面可用,它附带在 Mac OS

IOS Block简介,参考自官方文档

一.block 介绍 block 是c语言层次的语句,c中的方法比较相似.在一些其他的语言中,block 有时也被称为"closure"(闭包). 她可以被声明为指针变量,作为参数传递以供回调,在异步调用上也非常方便: block 是一种匿名内联的代码集合,文档上罗列了她的一些功能: 1.有如方法一样的参数列表 2.有返回类型 3.可以在其声明时所在的作用域中占有状态 4.可以在其作用域中选择性的更改状态 5.可以与相同作用域中的其他代码块分享变动的可能性 6.尽管其(栈)作用域被销毁

block的语法

主要内容: 1. 开始使用block(Getting Started with Blocks) 2. block概念综述(Conceptual Overview) 3. 声明和创建block(Declaring and Creating Blocks) 4. block和变量(Blocks and Variables) 5. 使用blocks(Using Blocks) block介绍 block对象是C-level语句和运行时的特征,跟标准C函数有些相似:但是除了代码,它可以包含栈变量和堆变量

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

Conceptual Overview(概览) Block objects provide a way for you to create an ad hoc function body as an expression in C, and C-derived languages such as Objective-C and C++. In other languages and environments, a block object is sometimes also called a “

oracle object_id和data_object_id的区别

Oracle的数据字典表dba_objects包含了两个字段,object_id, data_object_id,官方文档上的解释是: object_id: Dictionary object number of the object. Data_object_id: Dictionary object number of the segment that contains the object. 直译一下是: object_id:对象的数据字典标示. Data_object_id:包含对象的段

域初始化、静态块及构造方法等在创建类实例时的执行顺序(转载)

在<Core java 2: volumn 1, Edition 5>一书的第四章“对象与类”中讲到域赋值语句.实例块.静态块及构造方法等在创建类实例时的执行顺序,中文译本有些处翻译的不贴切,而英文原书中也有一处错误.本文通过一个小程序来说明类实例构造过程中的语句执行顺序. 程序如下: public class Teststaticblock { public Teststaticblock() { this("second"); System.out.println(&q

coffeescript 1.8.0 documents

CoffeeScript is a little language that compiles into JavaScript. Underneath that awkward Java-esque patina, JavaScript has always had a gorgeous heart. CoffeeScript is an attempt to expose the good parts of JavaScript in a simple way. The golden rule

ios编程之回调机制

ios编程之回调机制详解:   ———————————————— 函数/方法/block块一系列概念: 函数在大部分高级语言中都是个重要的概念,函数实现就是对一段代码的封装,我们一般会为了完成某一个业务功能或编程逻辑而需要组织数行代码,而这数行代码还有可能被使用多次,所以将它们封装成一个函数,每一次的执行我们称之为调函数或函数调用. 在C程序中,我们知道程序是从main函数开始执行,执行完main函数就退出程序,其实我们程序员很少去跟踪整个程序的执行流,一个程序(一段二进制代码)如何从加载到运行

iOS -- warnings

Semantic Warnings Warning Message -WCFString-literal input conversion stopped due to an input byte that does not belong to the input codeset UTF-8 -WNSObject-attribute         __attribute ((NSObject)) may be put on a typedef only, attribute is ignore