Block

发布时间:2016-12-31 7:21:42编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Block ",主要涉及到Block 方面的内容,对于Block 感兴趣的同学可以参考一下。

Block的实质是Objective-C的对象

1. Block的使用

Block的使用其实相当于代理,一般是跨越两个类来使用的。比如作为property属性或者作为方法的参数,这样就能跨越两个类了(参考:“Block全面分析”

如下为声明为property属性的方法

typedef void (^blk_t)(void);@property (nonatomic, copy) blk_t blk;

2.__block关键字的使用

- (void)viewDidLoad{    //将Block定义在方法内部    int x = 100;    void (^sumXAndYBlock)(int) = ^(int y){    x = x+y;    printf("new x value is %d",x);    };    sumXAndYBlock(50);}

上面在block内对x进行赋值,会提示错误,需要把x的声明改为如下:

__block int x = 100;

3. 截获自动变量

int main() {    int dmy = 256;    int val = 10;     const char *fmt = "val = %d\n"; //编译后 bound by copy      void (^blk)(void) = ^{printf(fmt,val);}; //在此截获,后面调用时调用的是此处的值     val = 2;    fmt = "These values were changed. val = %d\n";    blk();    return 0; }

(1)所谓“截获自动变量值”意味着在执行Block语法时,Block语法表达式所使用的自动变量值被保存到Block的结构体实例(即Block自身__main_block_impl_0)中。

(2)Block不能截获C语言数组类型的自动变量。

 (3)Block中使用自动变量后,在Block的结构体实例中重写该自动变量也不会改变原先截获的自动变量(实现上)。

4. 避免循环引用

   @weakify(self);    [[MTANetworkManager instance] addResMiddleware:^(id object, MTAMiddlewareNextBlock next) {        @strongify(self);            [self refreshTokenWithTask:task];    }];

上面的代码中,self拥有block,block中又使用了self,因此需要使用@weakify(self)和@strongify(self)来避免循环引用。

原理(参考“strongify & weakify”):

After @strongify is called, self will have a different pointer address inside the block than it will outside the block. That's because @strongify declares a new local variable called self each time. (This is why it suppresses the -Wshadow warning, which will “warn whenever a local variable shadows another local variable.”) It's worth reading and understanding the implementation of these functions. So even though the names are the same, treat them as separate strong references.

However, remember that after your first use of @strongify, self will refer to local, stack variables


上一篇:人生不能用百米冲刺的速度去跑
下一篇:新年SO交期更新——FP_SO2SAP

相关文章

关键词: Block

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款