您的位置:首页 > 其它

Block

2016-05-23 07:54 162 查看
单例是存储在静态区,不会执行dealloc方法,不用管理内存。

一百个单例对象的地址都是一样的。

block是一个数据类型, 多用于参数传递, 代替代理方法, (有多个参数需要传递或者多个代理方法需要实现还是推荐使用代理方法), 少用于当做返回值传递.

block是一个OC对象, 它的功能是保存代码片段, 预先准备好代码, 并在需要的时候执行.

在Xcode里输入inlineblock可以快速补全block定义:

<#returnType#> (^<#blockName#>) (<#parameterTypes#>) = ^ (<#parameters#>) {

<#statements#>

};

returnType : 返回值类型

blockName : block命名

parameterTypes : 参数类型

parameters : 参数

声明block使用 <#returnType#> (^<#blockName#>) (<#parameterTypes#>);

如: @property (copy, nonatomic) void (^block)(int);

^(<#参数#>){

/* 在Block中, 如果只使用全局或静态变量或不使用外部变量, 那么Block块的代码会存储在全局区;

如果使用了外部变量, 在ARC中, Block块的代码会存储在堆区;

在MRC中, Block快的代码会存储在栈区;

block默认情况下不能修改外部变量, 只能读取外部变量:

在ARC中, 外部变量存在堆中, 这个变量在Block块内与在Block块外地址相同;

外部变量存在栈中, 这个变量会被copy到为Block代码块所分配的堆中;

在MRC中, 外部变量存在堆中, 这个变量在Block块内与Block块外相同;

外部变量存在栈中, 这个变量会被copy到为Block代码块所分配的栈中;

如果需要修改外部变量, 需要在外部变量前面声明 __block

在ARC中, 外部变量存在堆中, 这个变量在Block块内与Block块外地址相同;

外部变量存在栈中, 这个变量会被转移到堆区, 不是复制, 是转移.

在MRC中, 外部变量存在堆中, 这个变量在Block块内与Block块外地址相同;

外部变量存在栈中, 这个变量在Block块内与Block块外地址相同;

*/

}

使用block代码块应注意内部循坏引用, 导致循环引用应在block定义前加上__weak声明:

__weak typeof(<#obj#>) weak<#obj#> = <#obj#>;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: