iOS 生涯ios学习iOS开发

iOS Block

2015-05-24  本文已影响930人  HackerOnce

Block 语法:

作为当地变量: 

 returnType (^blockName)(parameterTypes) = ^returnType(parameters) { ... ... }

作为属性:  

@property (nonatomic,copy) returnType (^blockName)(parameterTypes)

作为方法参数:

  -(void)someMethodThatTakesABlock:( returnType (^)(parameterTypes) )blockName

作为方法调用的参数:

[someObject someMethodThatTakesABlock:^returnType(parameters){ ... ... } ];

作为typeDef:

typedef returnType(^typeName)(parameterTypes)

TypeName blockName = ^returnType(parameters) { ... ... };

Block算是一个对象

BLock对变量的捕获规则

1 静态存储区的变量,例如全局变量,方法中的static变量,

可引用可修改

2 block接受的参数

传值,可修改,和一般函数的参数相同

3 栈变量:(被捕获的上下文变量)

const,不可修改,当block被copy后,block会对ID类型的变量产生弱引用,每次执行block 时捕获到的变量都是最初的值

4 栈变量(有block 前缀)

引用,可修改。如果是id类型则不会被block  retain, 必须手动处理其内存管理

如果是C类型变量,blcok 被copy到heap后,改值也会被挪动到heap

内存:

Block_copy()和Block_release()必须匹配

_block修饰词会将原本简单类型转化为较大的struct,给内存调用带来额外的开销

循环引用:block 被copy之后,该block会对他捕获到的对象产生Strong引用,如果self引用的block,block捕获了self,将会造成内存循环,解决方法

如果捕获到的是当前变量的成员变量,也会造成对self 的引用,同样会造成内存循环

Block是个对象,他对他所捕获到的值都进行强引用(strong)

上一篇下一篇

猜你喜欢

热点阅读