原因
使用__weak市因为block内部会对应用的对象进行强引用 如果block不释放对象也就不释放 而且很容易造成循环引用 所以我们对block内部使用的对象进行弱引用
一般情况在单线程情况下我们使用__weak 就够了
使用__weak 会出现一个问题那么就是由于weak是弱引用 那么我们引用的对象销毁的的话 __weak 修饰的对象会置为nil 这时内部引用对象会出现崩溃 所以我们应该在block对__weak 修饰的对象做 非空判断
如果在block内部使用多线程还会出现一个问题就是:在执行上半部分代码的时候,对象还在,而在执行下半部代码的时候对象已经被释放
这时我们应该使用 __strong TestObj *strongObj = weakObj;
函数内部使用对象 在函数销毁的时候才会销毁 保证对象的存在
__weak修饰的对象被Block引用,不会影响对象的释放,而__strong在Block内部修饰的对象,会保证,在使用这个对象在scope内,这个对象都不会被释放,出了scope,引用计数就会-1,且__strong主要是用在多线程运用中,若果只使用单线程,只需要使用__weak即可
另外typeof( ) 的个人理解及简单使用
:可以根据typeof()括号里面的变量,自动识别变量类型并返回该类型
最终结果可以理解为从新定义一个self 并且重新命名
_weak typeof(self) self = self;
参开链接
里面使用 strong 会使得循环引用 导致释放不掉 到那时除了作用域就会释放
会造成循环引用的前提下。我们使用 __strong 可以保证self存在
- (void)backAction {
[self.navigationController popViewControllerAnimated:YES];
__weak __typeof(self)weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
__strong __typeof(weakSelf)strongSelf = weakSelf;
NSLog(@"ThreeController dispatch_after %@",strongSelf.navigationItem.title);
});
NSLog(@"ThreeController -------------------- %@",self.navigationItem.title);
self.myblock = ^() {
__strong __typeof(weakSelf)strongSelf = weakSelf;
[NSThread sleepForTimeInterval:5.0];
NSLog(@"ThreeController -------------------- %@",strongSelf.navigationItem.title);
};
dispatch_async(dispatch_get_global_queue(0, 0), ^{
self.myblock();
});
}
属性的Block
记住。里面。使用 self.name. _name name 都会 强引用self
网友评论