iOS Block

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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 9,973评论 10 69
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,796评论 0 23
  • 目录 Block概述 Block定义方式 Block保存代码 Block传值 Block对外部变量的传递 Bloc...
    子斌阅读 1,447评论 2 7
  • Block是iOS开发中一种比较特殊的数据结构,它可以保存一段代码,在合适的地方再调用,具有语法简介、回调方便、编...
    飞鱼湾阅读 4,180评论 0 7
  • 前面写了一篇Block开发中的简单使用,这篇文章将深入的学习一下Block和开发中的一些使用。 目录 Block的...
    zyh1158阅读 2,203评论 6 10