在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内指的改变。
本文有参考其他!
网友评论