Block
2016-11-07 15:11:54 0 举报
Block是一个简洁而强大的工具,它可以帮助用户快速创建和管理各种类型的内容。无论是编写代码、设计网页还是制作音乐,Block都能提供丰富的功能和灵活的编辑环境。它的直观界面和易于使用的操作方式使得任何人都能够轻松上手,并迅速掌握其核心功能。此外,Block还支持多种文件格式的导入和导出,方便用户在不同平台之间进行交流和共享。无论是专业开发者还是创意设计师,Block都是一个不可或缺的工具,它将为您的工作带来更高的效率和更出色的成果。
作者其他创作
大纲/内容
int main() { int i = 1; void (^captureBlk)(void) = ^{//截获自动变量i的Block NSLog(@\"Capture:%d\
通用解法
_NSConcreteStackBlock
void (^blk)(void) = ^{ NSLog(@\"Global Block\");};int main() { blk(); NSLog(@\"%@\
_NSConcreteMallocBlock
block 括号里面引用括号外面的参数 比如count
全局block存储在全局数据区
int main() { int count = 10; void (^ blk)() = ^(){ NSLog(@\"In Block:%d\
WeakSelf
返回值类型 (^变量名)(参数列表) = 表达式
__block
优解通过传参
__block循环引用
全局数据区的Block对象
编译器会进行判断自动生成将Block从栈上复制到堆上所以大部分都是堆block
^ 返回值类型 (参数列表) {内容};
栈上和Block内(通常在堆上)可以访问和修改“同一个变量”
原理
ARC
OC语言
变量作为函数的参数时
block类型
在栈上创建的Block对象
block转成C语言
self.blk = ^(UIViewController *vc) { NSLog(@\"Use Property:%@\
变量作为返回值
在堆上创建的Block对象
变量
栈上的Block,如果其所属的栈作用域结束,该Block就会被废弃
简写
语法
^(int count) { return count ++; };是表达式
- (void)func:(int (^)(int))blk { NSLog(@\"Param:%@\
超出Block作用域仍需使用Block的情况,Block提供了将Block从栈上复制到堆上的方法来解决这种问题
static void __main_block_func_0( struct __main_block_impl_0 *__cself) {);}
_NSConcreteGlobalBlock
struct __block_impl { void *isa;//指明对象的Class int Flags; int Reserved; void *FuncPtr;};
block复制
int main() { void (^blk)(void) = ^{//没有截获自动变量的Block NSLog(@\"Stack Block\"); }; blk(); NSLog(@\"%@\
- (int (^)(int))funcR { return ^(int count) { return count ++; };}
自动变量
表达式
typedef int (^blk_k)(int);- (void)func:(blk_k)blk { NSLog(@\"Param:%@\
C语言
复制到堆上的Block,将_NSConcreteMallocBlock类对象写入Block结构体实例的成员变量isa:
^ int (int count) { return count + 1; };
Block
如果没有截获自动变量,Block的结构实例还是会被设置在程序的全局数据区,而非栈上:
将栈上用__block修饰的自动变量封装成一个结构体,让其在堆上创建,以方便从栈上或堆上访问和修改同一份数据
block存储域
返回值类型 可省略参数列表 可省略
int (^)(int)是返回的block变量
int (^blk)(int) = ^(int count) { return count + 1;};
作用
即便Block栈作用域已结束,但被拷贝到堆上的Block还可以继续存在
有截获自动变量,Block的结构实例还是会被设置在程序堆上:
0 条评论
下一页