使用原生网络请求并进行稍微封装时候出了点问题,总结如下:
#define WeakSelf(type) __weak typeof(type) weak##type = type;
#define StrongSelf(type) __strong typeof(type) type = weak##type;
People *p = [People new];
p.name = @"piter";
WeakSelf(p) //弱引用
p.MyBlock = ^(){
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"2.%@",weakp.name);
});
};
p.MyBlock();
这段代码,在block里面使用了GCD延迟调用,而在GCD代码块里面使用到了weakp这个对象,这个对象本身就是一个弱引用对象,在这里面没有使用就已经被释放了.所以像上面的代码是会输出null的.像这样的问题就需要引入__strong来解决.如下
People *p = [People new];
p.name = @"piter";
WeakSelf(p) //弱引用
p.MyBlock = ^(){
StrongSelf(p)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"2.%@“,p.name);
});
};
p.MyBlock();
这样就可以输出并且对象都会被释放.先解释下为什么:这个strong是对block内部的抢引用,不会干扰到block以外.所以不会影响people 和 myblock的释放.而对block内部的弱引用people强引用,就不会导致people提前释放了..