block的循环问题 - 草稿

2017-05-13  本文已影响10人  __Seven

在iOS8以后开发使用较多的block,但是在使用block的时候,有时不小心,会造成循环引用,所以一般我们在使用block的时候会这样做
__weak type(self)weakSelf =self;
在block中都使用weakSelf来代替self。

 - (void)Block {
__weak typeof(self) weakSelf = self;
self.block = ^{
    [weakSelf doSomething];
};

}
总结
在block不是作为一个property的时候,可以在block里面直接使用self,比如UIView的animation动画block。

当block被声明为一个property的时候,需要在block里面使用weakSelf,来解决循环引用的问题。下面看个有意思的代码

       - (void)testMethod { 

        int anInteger = 10;

         void (^testBlock)(void) = ^{

      NSLog(@"Integer is : %i", anInteger);

};
anInteger = 11;

testBlock();}

输出的是10而不是11.在block内把anIteger私有化了!外部不能修改了,
在看
- (void)testMethod {
__block int anInteger = 42;

              void (^testBlock)(void) = ^{
                   NSLog(@"Integer is : %i", anInteger);
              };

              anInteger = 50;

                  testBlock();
               }

加上--block修饰就可以允许外部对block内指的改变。
本文有参考其他!

上一篇下一篇

猜你喜欢

热点阅读